Student Details

## About

https://www.kaggle.com/zhangjuefei/birds-bones-and-living-habits

Context There are many kinds of birds: pigeons, ducks, ostriches, penguins… Some are good at flying, others can’t fly but run fast. Some swim under water, others wading in shallow pool.

According to their living environments and living habits, birds are classified into different ecological groups. There are 8 ecological groups of birds:

First 6 groups are main and are covered by this dataset.

Apparently, birds belong to different ecological groups have different appearances: flying birds have strong wings and wading birds have long legs. Their living habits are somewhat reflected in their bones’ shapes. As data scientists we may think of examining the underlying relationship between sizes of bones and ecological groups , and recognising birds’ ecological groups by their bones’ shapes.

Content There are 420 birds contained in this dataset. Each bird is represented by 10 measurements (features): — * Length and Diameter of Humerus * Length and Diameter of Ulna * Length and Diameter of Femur * Length and Diameter of Tibiotarsus * Length and Diameter of Tarsometatarsus — All measurements are continuous float numbers (mm) with missing values represented by empty strings. The skeletons of this dataset are collections of Natural History Museum of Los Angeles County. They belong to 21 orders, 153 genera, 245 species.

Each bird has a label for its ecological group

# Load your packages
library(tidyr)
library(dplyr)

Attaching package: ‘dplyr’

The following objects are masked from ‘package:stats’:

    filter, lag

The following objects are masked from ‘package:base’:

    intersect, setdiff, setequal, union
library(knitr)
library(GGally)

Attaching package: ‘GGally’

The following object is masked from ‘package:dplyr’:

    nasa
library(ggplot2)
library(ggridges)

Data

# Load your data and prepare for visualisation
birdDS <- read.csv("bird.csv")

Exploring the Data

# Load your data and prepare for visualisation
head(birdDS)
# Load your data and prepare for visualisation
colnames(birdDS)
 [1] "id"    "huml"  "humw"  "ulnal" "ulnaw" "feml"  "femw"  "tibl"  "tibw"  "tarl"  "tarw"  "type" 
colNamesFull <- c("ID", "HumerusLength", "HumerusDiameter", "UlnaLength", "UlnaDiameter",
                  "FemurLength", "FemurDiameter", "TibiotarusLength", "TibiotarusDiameter",
                  "TarsometatarusLength", "TarsometatarusDiameter", "EcologicalBirdType")
# Load your data and prepare for visualisation
summary(birdDS)
       id             huml             humw            ulnal            ulnaw             feml       
 Min.   :  0.0   Min.   :  9.85   Min.   : 1.140   Min.   : 14.09   Min.   : 1.000   Min.   : 11.83  
 1st Qu.:104.8   1st Qu.: 25.17   1st Qu.: 2.190   1st Qu.: 28.05   1st Qu.: 1.870   1st Qu.: 21.30  
 Median :209.5   Median : 44.18   Median : 3.500   Median : 43.71   Median : 2.945   Median : 31.13  
 Mean   :209.5   Mean   : 64.65   Mean   : 4.371   Mean   : 69.12   Mean   : 3.597   Mean   : 36.87  
 3rd Qu.:314.2   3rd Qu.: 90.31   3rd Qu.: 5.810   3rd Qu.: 97.52   3rd Qu.: 4.770   3rd Qu.: 47.12  
 Max.   :419.0   Max.   :420.00   Max.   :17.840   Max.   :422.00   Max.   :12.000   Max.   :117.07  
                 NA's   :1        NA's   :1        NA's   :3        NA's   :2        NA's   :2       
      femw             tibl             tibw             tarl             tarw        type    
 Min.   : 0.930   Min.   :  5.50   Min.   : 0.870   Min.   :  7.77   Min.   : 0.660   P : 38  
 1st Qu.: 1.715   1st Qu.: 36.42   1st Qu.: 1.565   1st Qu.: 23.04   1st Qu.: 1.425   R : 50  
 Median : 2.520   Median : 52.12   Median : 2.490   Median : 31.74   Median : 2.230   SO:128  
 Mean   : 3.221   Mean   : 64.66   Mean   : 3.182   Mean   : 39.23   Mean   : 2.930   SW:116  
 3rd Qu.: 4.135   3rd Qu.: 82.87   3rd Qu.: 4.255   3rd Qu.: 50.25   3rd Qu.: 3.500   T : 23  
 Max.   :11.640   Max.   :240.00   Max.   :11.030   Max.   :175.00   Max.   :14.090   W : 65  
 NA's   :1        NA's   :2        NA's   :1        NA's   :1        NA's   :1                
# Load your data and prepare for visualisation
str(birdDS)
'data.frame':   420 obs. of  12 variables:
 $ id   : int  0 1 2 3 4 5 6 7 8 9 ...
 $ huml : num  80.8 88.9 80 77.7 62.8 ...
 $ humw : num  6.68 6.63 6.37 5.7 4.84 ...
 $ ulnal: num  72 80.5 69.3 65.8 52.1 ...
 $ ulnaw: num  4.88 5.59 5.28 4.77 3.73 3.47 4.5 4.55 6.13 7.05 ...
 $ feml : num  41.8 47 43.1 40 34 ...
 $ femw : num  3.7 4.3 3.9 3.52 2.72 4.41 3.41 3.78 5.45 7.44 ...
 $ tibl : num  5.5 80.2 75.3 69.2 56.3 ...
 $ tibw : num  4.03 4.51 4.04 3.4 2.96 2.73 3.56 3.81 5.58 7.31 ...
 $ tarl : num  38.7 41.5 38.3 35.8 31.9 ...
 $ tarw : num  3.84 4.01 3.34 3.41 3.13 2.83 3.64 3.81 4.37 6.34 ...
 $ type : Factor w/ 6 levels "P","R","SO","SW",..: 4 4 4 4 4 4 4 4 4 4 ...
# Load your data and prepare for visualisation
head(birdDS)
# Check the species ID
unique(birdDS$type)
[1] SW W  T  R  P  SO
Levels: P R SO SW T W

Determine the mean values

# Determining the mean values
#meanValueByType <- aggregate(surveys_combined_year$weight ~ species_id, 
#                                     surveys_combined_year, mean, na.action = na.omit)
# Checking the output
#average_by_species_year
# SW - Swimming Birds
SWbirds <- subset(birdDS, birdDS$type == "SW") # SW - Swimming Birds
Wbirds <- subset(birdDS, birdDS$type == "W") # W - Wading Birds
Tbirds <- subset(birdDS, birdDS$type == "T") # T - Terrestrial Birds
Rbirds <- subset(birdDS, birdDS$type == "R") # R - Raptors
Pbirds <- subset(birdDS, birdDS$type == "P") # P - Scansorial Birds
SObirds <- subset(birdDS, birdDS$type == "SO") # SO - Singing Birds
summary(SWbirds)
       id              huml             humw            ulnal            ulnaw             feml       
 Min.   :  0.00   Min.   : 22.63   Min.   : 1.630   Min.   : 20.75   Min.   : 1.510   Min.   : 12.21  
 1st Qu.: 28.75   1st Qu.: 68.41   1st Qu.: 4.062   1st Qu.: 65.69   1st Qu.: 3.538   1st Qu.: 29.97  
 Median : 57.50   Median :100.06   Median : 5.735   Median : 96.94   Median : 4.685   Median : 39.33  
 Mean   : 57.50   Mean   :110.25   Mean   : 6.424   Mean   :111.76   Mean   : 5.222   Mean   : 42.17  
 3rd Qu.: 86.25   3rd Qu.:143.50   3rd Qu.: 7.878   3rd Qu.:133.75   3rd Qu.: 6.540   3rd Qu.: 51.02  
 Max.   :115.00   Max.   :420.00   Max.   :17.840   Max.   :422.00   Max.   :11.720   Max.   :110.54  
      femw            tibl             tibw             tarl             tarw        type    
 Min.   :0.970   Min.   :  5.50   Min.   : 1.010   Min.   : 18.42   Min.   : 0.830   P :  0  
 1st Qu.:2.572   1st Qu.: 57.59   1st Qu.: 2.712   1st Qu.: 30.12   1st Qu.: 2.245   R :  0  
 Median :3.660   Median : 75.28   Median : 4.035   Median : 39.70   Median : 3.225   SO:  0  
 Mean   :4.276   Mean   : 85.32   Mean   : 4.514   Mean   : 45.16   Mean   : 4.150   SW:116  
 3rd Qu.:5.810   3rd Qu.:106.03   3rd Qu.: 6.378   3rd Qu.: 56.14   3rd Qu.: 5.630   T :  0  
 Max.   :9.990   Max.   :237.00   Max.   :11.030   Max.   :128.35   Max.   :14.090   W :  0  
summary(Wbirds) # Two NA
       id           huml             humw            ulnal            ulnaw             feml       
 Min.   :116   Min.   : 22.39   Min.   : 1.530   Min.   : 24.16   Min.   : 1.290   Min.   : 15.71  
 1st Qu.:132   1st Qu.: 38.79   1st Qu.: 2.810   1st Qu.: 36.33   1st Qu.: 2.640   1st Qu.: 26.55  
 Median :148   Median : 70.93   Median : 4.340   Median : 75.44   Median : 3.840   Median : 38.41  
 Mean   :148   Mean   : 73.13   Mean   : 4.607   Mean   : 78.10   Mean   : 4.103   Mean   : 40.12  
 3rd Qu.:164   3rd Qu.: 88.16   3rd Qu.: 5.630   3rd Qu.: 99.31   3rd Qu.: 5.060   3rd Qu.: 48.23  
 Max.   :180   Max.   :190.00   Max.   :11.920   Max.   :225.00   Max.   :12.000   Max.   :101.75  
                                                                                   NA's   :1       
      femw            tibl             tibw            tarl             tarw      type   
 Min.   :1.140   Min.   : 30.31   Min.   :0.990   Min.   : 15.80   Min.   :0.83   P : 0  
 1st Qu.:2.075   1st Qu.: 46.24   1st Qu.:2.060   1st Qu.: 24.64   1st Qu.:1.71   R : 0  
 Median :3.020   Median : 70.39   Median :2.990   Median : 37.17   Median :2.53   SO: 0  
 Mean   :3.119   Mean   : 76.15   Mean   :3.179   Mean   : 47.54   Mean   :2.76   SW: 0  
 3rd Qu.:4.043   3rd Qu.: 89.93   3rd Qu.:4.090   3rd Qu.: 60.81   3rd Qu.:3.57   T : 0  
 Max.   :7.750   Max.   :240.00   Max.   :7.710   Max.   :175.00   Max.   :7.00   W :65  
 NA's   :1                                                                               
summary(Tbirds) 
       id             huml             humw            ulnal            ulnaw            feml       
 Min.   :181.0   Min.   : 20.25   Min.   : 2.350   Min.   : 25.14   Min.   :1.760   Min.   : 20.17  
 1st Qu.:186.5   1st Qu.: 32.06   1st Qu.: 3.290   1st Qu.: 28.64   1st Qu.:2.430   1st Qu.: 36.23  
 Median :192.0   Median : 34.24   Median : 3.600   Median : 35.24   Median :2.910   Median : 39.38  
 Mean   :192.0   Mean   : 45.70   Mean   : 4.786   Mean   : 45.62   Mean   :3.472   Mean   : 46.28  
 3rd Qu.:197.5   3rd Qu.: 44.27   3rd Qu.: 4.715   3rd Qu.: 51.58   3rd Qu.:3.765   3rd Qu.: 41.72  
 Max.   :203.0   Max.   :127.00   Max.   :13.790   Max.   :123.27   Max.   :9.420   Max.   :117.07  
      femw             tibl             tibw             tarl             tarw       type   
 Min.   : 1.370   Min.   : 27.67   Min.   : 1.410   Min.   : 15.68   Min.   :1.550   P : 0  
 1st Qu.: 2.645   1st Qu.: 49.03   1st Qu.: 2.380   1st Qu.: 26.78   1st Qu.:2.340   R : 0  
 Median : 2.870   Median : 53.77   Median : 2.710   Median : 31.00   Median :2.490   SO: 0  
 Mean   : 3.820   Mean   : 66.09   Mean   : 3.452   Mean   : 40.09   Mean   :3.184   SW: 0  
 3rd Qu.: 3.365   3rd Qu.: 56.44   3rd Qu.: 3.155   3rd Qu.: 34.82   3rd Qu.:2.945   T :23  
 Max.   :11.640   Max.   :189.00   Max.   :10.030   Max.   :134.00   Max.   :8.190   W : 0  
summary(Rbirds) # Four NA
       id             huml             humw            ulnal            ulnaw            feml      
 Min.   :204.0   Min.   : 33.12   Min.   : 2.400   Min.   : 39.85   Min.   :1.800   Min.   :27.46  
 1st Qu.:216.2   1st Qu.: 57.50   1st Qu.: 4.395   1st Qu.: 67.15   1st Qu.:3.540   1st Qu.:48.84  
 Median :228.5   Median : 89.88   Median : 6.125   Median :102.65   Median :4.800   Median :62.31  
 Mean   :228.5   Mean   : 86.93   Mean   : 6.066   Mean   :100.34   Mean   :4.813   Mean   :62.02  
 3rd Qu.:240.8   3rd Qu.:115.03   3rd Qu.: 7.550   3rd Qu.:129.39   3rd Qu.:6.190   3rd Qu.:76.16  
 Max.   :253.0   Max.   :145.00   Max.   :10.370   Max.   :188.00   Max.   :7.920   Max.   :94.79  
                                                   NA's   :1        NA's   :1                      
      femw            tibl             tibw            tarl            tarw       type   
 Min.   :2.190   Min.   : 38.99   Min.   :2.150   Min.   :19.10   Min.   :2.220   P : 0  
 1st Qu.:3.783   1st Qu.: 66.58   1st Qu.:3.478   1st Qu.:46.81   1st Qu.:3.150   R :50  
 Median :5.060   Median : 96.36   Median :4.935   Median :60.19   Median :4.950   SO: 0  
 Mean   :5.267   Mean   : 89.88   Mean   :4.949   Mean   :59.17   Mean   :5.074   SW: 0  
 3rd Qu.:6.670   3rd Qu.:113.21   3rd Qu.:6.115   3rd Qu.:73.29   3rd Qu.:6.800   T : 0  
 Max.   :8.920   Max.   :126.54   Max.   :7.900   Max.   :99.72   Max.   :9.640   W : 0  
                                                  NA's   :1       NA's   :1              
summary(Pbirds)
       id             huml            humw           ulnal           ulnaw            feml      
 Min.   :254.0   Min.   : 9.85   Min.   :1.730   Min.   :14.73   Min.   :1.410   Min.   :16.27  
 1st Qu.:263.2   1st Qu.:28.70   1st Qu.:2.660   1st Qu.:31.96   1st Qu.:2.067   1st Qu.:20.64  
 Median :272.5   Median :33.80   Median :2.930   Median :38.55   Median :2.415   Median :25.40  
 Mean   :272.5   Mean   :34.42   Mean   :3.039   Mean   :39.18   Mean   :2.476   Mean   :28.22  
 3rd Qu.:281.8   3rd Qu.:42.30   3rd Qu.:3.493   3rd Qu.:47.30   3rd Qu.:2.900   3rd Qu.:31.86  
 Max.   :291.0   Max.   :49.12   Max.   :4.640   Max.   :60.95   Max.   :3.520   Max.   :54.67  
      femw            tibl            tibw            tarl            tarw       type   
 Min.   :1.210   Min.   :20.89   Min.   :1.050   Min.   : 7.77   Min.   :1.160   P :38  
 1st Qu.:1.980   1st Qu.:31.97   1st Qu.:1.633   1st Qu.:15.82   1st Qu.:1.532   R : 0  
 Median :2.135   Median :36.65   Median :1.885   Median :21.89   Median :1.740   SO: 0  
 Mean   :2.308   Mean   :41.88   Mean   :2.096   Mean   :25.79   Mean   :1.903   SW: 0  
 3rd Qu.:2.505   3rd Qu.:49.23   3rd Qu.:2.283   3rd Qu.:30.54   3rd Qu.:2.058   T : 0  
 Max.   :4.250   Max.   :85.88   Max.   :4.120   Max.   :63.91   Max.   :3.600   W : 0  
summary(SObirds) # Nine NA
       id             huml            humw          ulnal           ulnaw            feml      
 Min.   :292.0   Min.   :12.69   Min.   :1.14   Min.   :14.09   Min.   :1.000   Min.   :11.83  
 1st Qu.:323.8   1st Qu.:18.68   1st Qu.:1.66   1st Qu.:21.99   1st Qu.:1.410   1st Qu.:17.23  
 Median :355.5   Median :21.53   Median :1.93   Median :25.64   Median :1.710   Median :20.67  
 Mean   :355.5   Mean   :22.36   Mean   :2.03   Mean   :26.40   Mean   :1.744   Mean   :21.38  
 3rd Qu.:387.2   3rd Qu.:25.30   3rd Qu.:2.32   3rd Qu.:29.23   3rd Qu.:1.955   3rd Qu.:24.02  
 Max.   :419.0   Max.   :48.20   Max.   :4.08   Max.   :61.94   Max.   :3.750   Max.   :40.11  
                 NA's   :1       NA's   :1      NA's   :2       NA's   :1       NA's   :1      
      femw           tibl            tibw            tarl            tarw       type    
 Min.   :0.93   Min.   :22.13   Min.   :0.870   Min.   :15.19   Min.   :0.660   P :  0  
 1st Qu.:1.28   1st Qu.:28.70   1st Qu.:1.220   1st Qu.:19.84   1st Qu.:1.048   R :  0  
 Median :1.64   Median :35.48   Median :1.430   Median :24.31   Median :1.265   SO:128  
 Mean   :1.68   Mean   :36.33   Mean   :1.549   Mean   :25.84   Mean   :1.349   SW:  0  
 3rd Qu.:1.91   3rd Qu.:40.73   3rd Qu.:1.780   3rd Qu.:29.65   3rd Qu.:1.603   T :  0  
 Max.   :3.51   Max.   :64.97   Max.   :3.210   Max.   :48.35   Max.   :2.570   W :  0  
                NA's   :2       NA's   :1                                               
# Filling NA - Rbirds
Wbirds$feml[is.na(Wbirds$feml)] <- mean(Wbirds$feml, na.rm = TRUE)
Wbirds$femw[is.na(Wbirds$femw)] <- mean(Wbirds$femw, na.rm = TRUE)
# Filling NA - Rbirds
Rbirds$ulnal[is.na(Rbirds$ulnal)] <- mean(Rbirds$ulnal, na.rm = TRUE)
Rbirds$ulnaw[is.na(Rbirds$ulnaw)] <- mean(Rbirds$ulnaw, na.rm = TRUE)
Rbirds$tarl[is.na(Rbirds$tarl)] <- mean(Rbirds$tarl, na.rm = TRUE)
Rbirds$tarw[is.na(Rbirds$tarw)] <- mean(Rbirds$tarw, na.rm = TRUE)
# Filling NA - SObirds
SObirds$huml[is.na(SObirds$huml)] <- mean(SObirds$huml, na.rm = TRUE)
SObirds$humw[is.na(SObirds$humw)] <- mean(SObirds$humw, na.rm = TRUE)
SObirds$ulnal[is.na(SObirds$ulnal)] <- mean(SObirds$ulnal, na.rm = TRUE)
SObirds$ulnaw[is.na(SObirds$ulnaw)] <- mean(SObirds$ulnaw, na.rm = TRUE)
SObirds$feml[is.na(SObirds$feml)] <- mean(SObirds$feml, na.rm = TRUE)
SObirds$tibl[is.na(SObirds$tibl)] <- mean(SObirds$tibl, na.rm = TRUE)
SObirds$tibw[is.na(SObirds$tibw)] <- mean(SObirds$tibw, na.rm = TRUE)
birdDS_clean <- rbind(SWbirds, Wbirds, Tbirds, Rbirds, Pbirds, SObirds)
summary(birdDS_clean)
       id             huml             humw            ulnal            ulnaw             feml       
 Min.   :  0.0   Min.   :  9.85   Min.   : 1.140   Min.   : 14.09   Min.   : 1.000   Min.   : 11.83  
 1st Qu.:104.8   1st Qu.: 25.04   1st Qu.: 2.188   1st Qu.: 28.00   1st Qu.: 1.867   1st Qu.: 21.33  
 Median :209.5   Median : 44.08   Median : 3.495   Median : 43.51   Median : 2.945   Median : 31.13  
 Mean   :209.5   Mean   : 64.55   Mean   : 4.365   Mean   : 68.99   Mean   : 3.596   Mean   : 36.84  
 3rd Qu.:314.2   3rd Qu.: 90.22   3rd Qu.: 5.805   3rd Qu.: 97.56   3rd Qu.: 4.772   3rd Qu.: 47.10  
 Max.   :419.0   Max.   :420.00   Max.   :17.840   Max.   :422.00   Max.   :12.000   Max.   :117.07  
      femw             tibl             tibw             tarl             tarw        type    
 Min.   : 0.930   Min.   :  5.50   Min.   : 0.870   Min.   :  7.77   Min.   : 0.660   P : 38  
 1st Qu.: 1.718   1st Qu.: 36.34   1st Qu.: 1.560   1st Qu.: 23.04   1st Qu.: 1.427   R : 50  
 Median : 2.525   Median : 51.94   Median : 2.490   Median : 31.81   Median : 2.235   SO:128  
 Mean   : 3.221   Mean   : 64.53   Mean   : 3.178   Mean   : 39.28   Mean   : 2.935   SW:116  
 3rd Qu.: 4.122   3rd Qu.: 82.87   3rd Qu.: 4.253   3rd Qu.: 50.46   3rd Qu.: 3.522   T : 23  
 Max.   :11.640   Max.   :240.00   Max.   :11.030   Max.   :175.00   Max.   :14.090   W : 65  
ggplot(data = birdDS_clean, aes(x = type, y = huml)) + geom_boxplot()

ggplot(data = birdDS_clean, aes(x = type, y = humw)) + geom_boxplot()

ggplot(data = birdDS_clean, aes(x = type, y = ulnal)) + geom_boxplot()

ggplot(data = birdDS_clean, aes(x = type, y = ulnaw)) + geom_boxplot()

ggplot(data = birdDS_clean, aes(x = type, y = feml)) + geom_boxplot()

ggplot(data = birdDS_clean, aes(x = type, y = femw)) + geom_boxplot()

Could split out the length and width variables…

Visualisation

colnames(birdDS_clean)
 [1] "id"    "huml"  "humw"  "ulnal" "ulnaw" "feml"  "femw"  "tibl"  "tibw"  "tarl"  "tarw"  "type" 
allMeasurements <- c("huml", "humw", "ulnal", "ulnaw", "feml",  "femw",  "tibl",  "tibw",  "tarl",  "tarw")
lengthMeasurements <- c("huml", "ulnal", "feml",  "tibl",  "tarl")
widthMeasurements <- c("humw", "ulnaw",  "femw", "tibw", "tarw")
# Visualise Your Data
scatter_matrix <- ggpairs(data = birdDS_clean,
        columns = allMeasurements,
        mapping = aes(colour = type),
        diag = list(continuous = wrap("densityDiag", alpha=I(0.1)), mapping = ggplot2::aes(fill=type)),
        upper = list(continuous = wrap("density", alpha = I(0.5)), combo = "box"),
        lower = list(continuous = wrap("points", alpha = I(0.4), size = 0.1)))
scatter_matrix_adjusted <- scatter_matrix + theme(panel.spacing=grid::unit(0,"lines"),
                       axis.text = element_text(size = rel(0.5)),
                       strip.text = element_text(face = "bold", size=7),
                       strip.text.x = element_text(margin = margin(.1, 0, .1, 0, "cm")),
                       strip.text.y = element_text(margin = margin(0, .1, 0, .1, "cm")))
scatter_matrix_adjusted + theme(panel.border = element_rect(fill = NA, colour = "grey30", size = 0.2))

 plot: [1,1] [=-------------------------------------------------------------------------]  1% est: 0s 
 plot: [1,2] [=-------------------------------------------------------------------------]  2% est:28s 
 plot: [1,3] [==------------------------------------------------------------------------]  3% est:41s 
 plot: [1,4] [===-----------------------------------------------------------------------]  4% est:46s 
 plot: [1,5] [====----------------------------------------------------------------------]  5% est:44s 
 plot: [1,6] [====----------------------------------------------------------------------]  6% est:43s 
 plot: [1,7] [=====---------------------------------------------------------------------]  7% est:42s 
 plot: [1,8] [======--------------------------------------------------------------------]  8% est:41s 
 plot: [1,9] [=======-------------------------------------------------------------------]  9% est:40s 
 plot: [1,10] [=======------------------------------------------------------------------] 10% est:39s 
 plot: [2,1] [========------------------------------------------------------------------] 11% est:38s 
 plot: [2,2] [=========-----------------------------------------------------------------] 12% est:36s 
 plot: [2,3] [==========----------------------------------------------------------------] 13% est:34s 
 plot: [2,4] [==========----------------------------------------------------------------] 14% est:34s 
 plot: [2,5] [===========---------------------------------------------------------------] 15% est:34s 
 plot: [2,6] [============--------------------------------------------------------------] 16% est:34s 
 plot: [2,7] [=============-------------------------------------------------------------] 17% est:33s 
 plot: [2,8] [=============-------------------------------------------------------------] 18% est:33s 
 plot: [2,9] [==============------------------------------------------------------------] 19% est:33s 
 plot: [2,10] [===============----------------------------------------------------------] 20% est:32s 
 plot: [3,1] [================----------------------------------------------------------] 21% est:32s 
 plot: [3,2] [================----------------------------------------------------------] 22% est:30s 
 plot: [3,3] [=================---------------------------------------------------------] 23% est:29s 
 plot: [3,4] [==================--------------------------------------------------------] 24% est:28s 
 plot: [3,5] [==================--------------------------------------------------------] 25% est:28s 
 plot: [3,6] [===================-------------------------------------------------------] 26% est:28s 
 plot: [3,7] [====================------------------------------------------------------] 27% est:27s 
 plot: [3,8] [=====================-----------------------------------------------------] 28% est:27s 
 plot: [3,9] [=====================-----------------------------------------------------] 29% est:27s 
 plot: [3,10] [======================---------------------------------------------------] 30% est:27s 
 plot: [4,1] [=======================---------------------------------------------------] 31% est:26s 
 plot: [4,2] [========================--------------------------------------------------] 32% est:25s 
 plot: [4,3] [========================--------------------------------------------------] 33% est:25s 
 plot: [4,4] [=========================-------------------------------------------------] 34% est:24s 
 plot: [4,5] [==========================------------------------------------------------] 35% est:23s 
 plot: [4,6] [===========================-----------------------------------------------] 36% est:23s 
 plot: [4,7] [===========================-----------------------------------------------] 37% est:23s 
 plot: [4,8] [============================----------------------------------------------] 38% est:22s 
 plot: [4,9] [=============================---------------------------------------------] 39% est:22s 
 plot: [4,10] [=============================--------------------------------------------] 40% est:22s 
 plot: [5,1] [==============================--------------------------------------------] 41% est:22s 
 plot: [5,2] [===============================-------------------------------------------] 42% est:21s 
 plot: [5,3] [================================------------------------------------------] 43% est:20s 
 plot: [5,4] [=================================-----------------------------------------] 44% est:20s 
 plot: [5,5] [=================================-----------------------------------------] 45% est:19s 
 plot: [5,6] [==================================----------------------------------------] 46% est:18s 
 plot: [5,7] [===================================---------------------------------------] 47% est:18s 
 plot: [5,8] [====================================--------------------------------------] 48% est:18s 
 plot: [5,9] [====================================--------------------------------------] 49% est:18s 
 plot: [5,10] [====================================-------------------------------------] 50% est:17s 
 plot: [6,1] [======================================------------------------------------] 51% est:17s 
 plot: [6,2] [======================================------------------------------------] 52% est:17s 
 plot: [6,3] [=======================================-----------------------------------] 53% est:16s 
 plot: [6,4] [========================================----------------------------------] 54% est:16s 
 plot: [6,5] [=========================================---------------------------------] 55% est:15s 
 plot: [6,6] [=========================================---------------------------------] 56% est:15s 
 plot: [6,7] [==========================================--------------------------------] 57% est:14s 
 plot: [6,8] [===========================================-------------------------------] 58% est:14s 
 plot: [6,9] [============================================------------------------------] 59% est:14s 
 plot: [6,10] [============================================-----------------------------] 60% est:13s 
 plot: [7,1] [=============================================-----------------------------] 61% est:13s 
 plot: [7,2] [==============================================----------------------------] 62% est:13s 
 plot: [7,3] [===============================================---------------------------] 63% est:12s 
 plot: [7,4] [===============================================---------------------------] 64% est:12s 
 plot: [7,5] [================================================--------------------------] 65% est:11s 
 plot: [7,6] [=================================================-------------------------] 66% est:11s 
 plot: [7,7] [==================================================------------------------] 67% est:10s 
 plot: [7,8] [==================================================------------------------] 68% est:10s 
 plot: [7,9] [===================================================-----------------------] 69% est:10s 
 plot: [7,10] [===================================================----------------------] 70% est: 9s 
 plot: [8,1] [=====================================================---------------------] 71% est: 9s 
 plot: [8,2] [=====================================================---------------------] 72% est: 9s 
 plot: [8,3] [======================================================--------------------] 73% est: 8s 
 plot: [8,4] [=======================================================-------------------] 74% est: 8s 
 plot: [8,5] [========================================================------------------] 75% est: 8s 
 plot: [8,6] [========================================================------------------] 76% est: 7s 
 plot: [8,7] [=========================================================-----------------] 77% est: 7s 
 plot: [8,8] [==========================================================----------------] 78% est: 7s 
 plot: [8,9] [==========================================================----------------] 79% est: 6s 
 plot: [8,10] [==========================================================---------------] 80% est: 6s 
 plot: [9,1] [============================================================--------------] 81% est: 6s 
 plot: [9,2] [=============================================================-------------] 82% est: 5s 
 plot: [9,3] [=============================================================-------------] 83% est: 5s 
 plot: [9,4] [==============================================================------------] 84% est: 5s 
 plot: [9,5] [===============================================================-----------] 85% est: 4s 
 plot: [9,6] [================================================================----------] 86% est: 4s 
 plot: [9,7] [================================================================----------] 87% est: 4s 
 plot: [9,8] [=================================================================---------] 88% est: 3s 
 plot: [9,9] [==================================================================--------] 89% est: 3s 
 plot: [9,10] [==================================================================-------] 90% est: 3s 
 plot: [10,1] [==================================================================-------] 91% est: 3s 
 plot: [10,2] [===================================================================------] 92% est: 2s 
 plot: [10,3] [====================================================================-----] 93% est: 2s 
 plot: [10,4] [=====================================================================----] 94% est: 2s 
 plot: [10,5] [=====================================================================----] 95% est: 1s 
 plot: [10,6] [======================================================================---] 96% est: 1s 
 plot: [10,7] [=======================================================================--] 97% est: 1s 
 plot: [10,8] [========================================================================-] 98% est: 1s 
 plot: [10,9] [========================================================================-] 99% est: 0s 
 plot: [10,10] [========================================================================]100% est: 0s 
                                                                                                      

# Visualise Your Data
scatter_matrix_length <- ggpairs(data = birdDS_clean,
        columns = lengthMeasurements,
        mapping = aes(colour = type),
        diag = list(continuous = wrap("densityDiag", alpha=I(0.1)), mapping = ggplot2::aes(fill=type)),
        upper = list(continuous = wrap("density", alpha = I(0.5)), combo = "box"),
        lower = list(continuous = wrap("points", alpha = I(0.4), size = 0.1)))
scatter_matrix_length_adjusted <- scatter_matrix_length + theme(panel.spacing=grid::unit(0,"lines"),
                       axis.text = element_text(size = rel(0.5)),
                       strip.text = element_text(face = "bold", size=7),
                       strip.text.x = element_text(margin = margin(.1, 0, .1, 0, "cm")),
                       strip.text.y = element_text(margin = margin(0, .1, 0, .1, "cm")))
scatter_matrix_length_adjusted + theme(panel.border = element_rect(fill = NA, colour = "grey30", size = 0.2))

 plot: [1,1] [===-----------------------------------------------------------------------]  4% est: 0s 
 plot: [1,2] [======--------------------------------------------------------------------]  8% est: 2s 
 plot: [1,3] [=========-----------------------------------------------------------------] 12% est: 5s 
 plot: [1,4] [============--------------------------------------------------------------] 16% est: 6s 
 plot: [1,5] [===============-----------------------------------------------------------] 20% est: 6s 
 plot: [2,1] [==================--------------------------------------------------------] 24% est: 6s 
 plot: [2,2] [=====================-----------------------------------------------------] 28% est: 5s 
 plot: [2,3] [========================--------------------------------------------------] 32% est: 5s 
 plot: [2,4] [===========================-----------------------------------------------] 36% est: 5s 
 plot: [2,5] [==============================--------------------------------------------] 40% est: 5s 
 plot: [3,1] [=================================-----------------------------------------] 44% est: 4s 
 plot: [3,2] [====================================--------------------------------------] 48% est: 4s 
 plot: [3,3] [======================================------------------------------------] 52% est: 3s 
 plot: [3,4] [=========================================---------------------------------] 56% est: 3s 
 plot: [3,5] [============================================------------------------------] 60% est: 3s 
 plot: [4,1] [===============================================---------------------------] 64% est: 3s 
 plot: [4,2] [==================================================------------------------] 68% est: 2s 
 plot: [4,3] [=====================================================---------------------] 72% est: 2s 
 plot: [4,4] [========================================================------------------] 76% est: 2s 
 plot: [4,5] [===========================================================---------------] 80% est: 1s 
 plot: [5,1] [==============================================================------------] 84% est: 1s 
 plot: [5,2] [=================================================================---------] 88% est: 1s 
 plot: [5,3] [====================================================================------] 92% est: 1s 
 plot: [5,4] [=======================================================================---] 96% est: 0s 
 plot: [5,5] [==========================================================================]100% est: 0s 
                                                                                                      

# Visualise Your Data
scatter_matrix_width <- ggpairs(data = birdDS_clean,
        columns = widthMeasurements,
        mapping = aes(colour = type),
        diag = list(continuous = wrap("densityDiag", alpha=I(0.1)), mapping = ggplot2::aes(fill=type)),
        upper = list(continuous = wrap("density", alpha = I(0.5)), combo = "box"),
        lower = list(continuous = wrap("points", alpha = I(0.4), size = 0.1)))
scatter_matrix_width_adjusted <- scatter_matrix_width + theme(panel.spacing=grid::unit(0,"lines"),
                       axis.text = element_text(size = rel(0.5)),
                       strip.text = element_text(face = "bold", size=7),
                       strip.text.x = element_text(margin = margin(.1, 0, .1, 0, "cm")),
                       strip.text.y = element_text(margin = margin(0, .1, 0, .1, "cm")))
scatter_matrix_width_adjusted + theme(panel.border = element_rect(fill = NA, colour = "grey30", size = 0.2))

 plot: [1,1] [===-----------------------------------------------------------------------]  4% est: 0s 
 plot: [1,2] [======--------------------------------------------------------------------]  8% est: 2s 
 plot: [1,3] [=========-----------------------------------------------------------------] 12% est: 5s 
 plot: [1,4] [============--------------------------------------------------------------] 16% est: 6s 
 plot: [1,5] [===============-----------------------------------------------------------] 20% est: 6s 
 plot: [2,1] [==================--------------------------------------------------------] 24% est: 6s 
 plot: [2,2] [=====================-----------------------------------------------------] 28% est: 5s 
 plot: [2,3] [========================--------------------------------------------------] 32% est: 5s 
 plot: [2,4] [===========================-----------------------------------------------] 36% est: 5s 
 plot: [2,5] [==============================--------------------------------------------] 40% est: 5s 
 plot: [3,1] [=================================-----------------------------------------] 44% est: 5s 
 plot: [3,2] [====================================--------------------------------------] 48% est: 4s 
 plot: [3,3] [======================================------------------------------------] 52% est: 4s 
 plot: [3,4] [=========================================---------------------------------] 56% est: 3s 
 plot: [3,5] [============================================------------------------------] 60% est: 3s 
 plot: [4,1] [===============================================---------------------------] 64% est: 3s 
 plot: [4,2] [==================================================------------------------] 68% est: 2s 
 plot: [4,3] [=====================================================---------------------] 72% est: 2s 
 plot: [4,4] [========================================================------------------] 76% est: 2s 
 plot: [4,5] [===========================================================---------------] 80% est: 1s 
 plot: [5,1] [==============================================================------------] 84% est: 1s 
 plot: [5,2] [=================================================================---------] 88% est: 1s 
 plot: [5,3] [====================================================================------] 92% est: 1s 
 plot: [5,4] [=======================================================================---] 96% est: 0s 
 plot: [5,5] [==========================================================================]100% est: 0s 
                                                                                                      

  • SW: Swimming Birds
  • W: Wading Birds
  • T: Terrestrial Birds
  • R: Raptors
  • P: Scansorial Birds
  • SO: Singing Birds
# Did not work
test_reorder <- birdDS_clean[,c(12,2,3,4,5,6,7,8,9,10,11,1)]
# Did not work
test <- birdDS_clean %>% gather("huml", "humw", "ulnal", "ulnaw", "feml",  "femw",  "tibl",  "tibw",  "tarl",  "tarw", 
                   key = "id", value = "measurement")
#dim(SWbirds) # L = 116 * 
#dim(Wbirds) # L = 65
#dim(Tbirds)
#dim(Rbirds)
#dim(Pbirds)
#dim(SObirds) 
SWbirdsLong <- SWbirds %>% gather("huml", "humw", "ulnal", "ulnaw", "feml",  "femw",  "tibl",  "tibw",  "tarl",  "tarw", 
                   key = "type", value = "measurement")
SWbirdsLong$id <- 'SW'
WbirdsLong <- Wbirds %>% gather("huml", "humw", "ulnal", "ulnaw", "feml",  "femw",  "tibl",  "tibw",  "tarl",  "tarw", 
                   key = "type", value = "measurement")
WbirdsLong$id <- 'W'
TbirdsLong <- Tbirds %>% gather("huml", "humw", "ulnal", "ulnaw", "feml",  "femw",  "tibl",  "tibw",  "tarl",  "tarw", 
                   key = "type", value = "measurement")
TbirdsLong$id <- 'T'
RbirdsLong <- Rbirds %>% gather("huml", "humw", "ulnal", "ulnaw", "feml",  "femw",  "tibl",  "tibw",  "tarl",  "tarw", 
                   key = "type", value = "measurement")
RbirdsLong$id <- 'R'
PbirdsLong <- Pbirds %>% gather("huml", "humw", "ulnal", "ulnaw", "feml",  "femw",  "tibl",  "tibw",  "tarl",  "tarw", 
                   key = "type", value = "measurement")
PbirdsLong$id <- 'P'
SObirdsLong <- SObirds %>% gather("huml", "humw", "ulnal", "ulnaw", "feml",  "femw",  "tibl",  "tibw",  "tarl",  "tarw", 
                   key = "type", value = "measurement")
SObirdsLong$id <- 'SO'
birdDS_Long <- rbind(SWbirdsLong, WbirdsLong, TbirdsLong, RbirdsLong, PbirdsLong, SObirdsLong)
summary(birdDS_Long)
      id                type            measurement    
 Length:4200        Length:4200        Min.   :  0.66  
 Class :character   Class :character   1st Qu.:  2.67  
 Mode  :character   Mode  :character   Median : 12.47  
                                       Mean   : 29.15  
                                       3rd Qu.: 38.50  
                                       Max.   :422.00  
colnames(birdDS_Long) <- c("birdType", "bone", "measurement")
ggNew <- ggplot(data = birdDS_Long, aes(x=birdDS_Long$measurement, y = bone, fill = birdType))
ggNew + geom_density_ridges(aes(x = bone), 
           alpha = .8, color = "white") +
  theme_ridges(grid = FALSE)

ggNew <- ggplot(data = birdDS_Long, aes(x=birdDS_Long$measurement, y = birdType, fill = bone))
ggNew + geom_density_ridges(aes(x = bone), 
           alpha = .8, color = "white") +
  theme_ridges(grid = FALSE)

ggNew <- ggplot(data = birdDS_Long, aes(x=birdDS_Long$measurement, y = birdType, fill = bone))
ggNew + geom_density_ridges(aes(x = measurement), alpha = .8, color = "white") +
  theme_ridges(grid = FALSE)

ggNew <- ggplot(data = birdDS_Long, aes(x=birdDS_Long$measurement, y = bone, fill = birdType))
ggNew + geom_density_ridges(aes(x = measurement), alpha = .8, color = "white") +
  theme_ridges(grid = FALSE)

ggplot(data = birdDS_Long, aes(x=birdDS_Long$measurement, y = bone, fill = birdType)) + 
   geom_density_ridges2(scale = 1) +
   theme_minimal(base_size = 14) + theme(axis.text.y = element_text(vjust = 0)) +
   scale_x_continuous(expand = c(0.01, 0)) +
   coord_cartesian(xlim = c(0, 200)) +  
   scale_y_discrete(expand = c(0.01, 0))

ggplot(data = birdDS_Long, aes(x=birdDS_Long$measurement, y = bone, fill = birdType)) + 
   geom_density_ridges2(scale = 1) +
   theme_minimal(base_size = 14) + theme(axis.text.y = element_text(vjust = 0)) +
   scale_x_continuous(expand = c(0.01, 0)) +
   coord_cartesian(xlim = c(0, 200)) +  
   scale_y_discrete(expand = c(0.01, 0)) + 
  facet_grid(.~birdType)

ggplot(data = birdDS_Long, aes(x=birdDS_Long$measurement, y = birdType, fill = bone)) + 
   geom_density_ridges2(scale = 1) +
   theme_minimal(base_size = 14) + theme(axis.text.y = element_text(vjust = 0)) +
   scale_x_continuous(expand = c(0.01, 0)) +
   coord_cartesian(xlim = c(0, 200)) +  
   scale_y_discrete(expand = c(0.01, 0)) + 
  facet_grid(.~bone)

http://davemcg.github.io/post/let-s-plot-5-ridgeline-density-plots/ https://feedyeti.com/hashtag.php?q=ggridges https://stackoverflow.com/questions/46012951/temperature-plot-error-in-funxi-object-y-not-found http://www.cookbook-r.com/Graphs/Colors_(ggplot2)/ # scale_fill_brewer(palette=“Spectral”) http://ggplot2.tidyverse.org/reference/scale_brewer.html http://www.stat.columbia.edu/~tzheng/files/Rcolor.pdf http://clayford.github.io/dwir/dwr_05_combine_merge_rehsape_data.html https://twitter.com/@eatonjw https://stackoverflow.com/questions/46012951/temperature-plot-error-in-funxi-object-y-not-found https://feedyeti.com/hashtag.php?q=ggjoy https://homepage.divms.uiowa.edu/~luke/classes/STAT4580/boxetc.html https://zhuanlan.zhihu.com/p/32115772

ggplot(data = birdDS_Long, aes(x=birdDS_Long$measurement, y = birdType, fill = bone)) + 
  geom_density_ridges(alpha=0.6) + 
  coord_cartesian(xlim = c(0, 200)) +  
  theme_ridges() + scale_fill_brewer(palette = 'Set1')

# Need to add two BOOLEAN columns
# OR
# Length and Width in one column... (this!)
birdDS_Long$measurementType <- sapply(strsplit(as.character(birdDS_Long$bone), ""), tail, 1)
birdDS_Long$boneAlone = substr(birdDS_Long$bone,1,nchar(birdDS_Long$bone)-1)
(aes(y = Drug, x=log2(Area), group=Well.names, fill=DMSO))
* x     -> log2(Area)
* y     -> Drug
* group -> Well.names
* fill  -> DMSO
ggplot(data = birdDS_Long, aes(x=birdDS_Long$measurement, y = birdType, fill = measurementType)) + 
   geom_density_ridges2(scale = 1) +
   theme_minimal(base_size = 14) + theme(axis.text.y = element_text(vjust = 0)) +
   scale_x_continuous(expand = c(0.01, 0)) +
   coord_cartesian(xlim = c(0, 200)) +  
   scale_y_discrete(expand = c(0.01, 0)) + 
  facet_grid(.~boneAlone)

ggplot(data = birdDS_Long, aes(x=birdDS_Long$measurement, y = boneAlone, fill = measurementType)) + 
   geom_density_ridges2(scale = 1) +
   theme_minimal(base_size = 14) + theme(axis.text.y = element_text(vjust = 0)) +
   scale_x_continuous(expand = c(0.01, 0)) +
   coord_cartesian(xlim = c(0, 200)) +  
   scale_y_discrete(expand = c(0.01, 0)) + 
  facet_grid(.~birdType)

ggplot(data = birdDS_Long, aes(x=birdDS_Long$measurement, y = boneAlone, fill = measurementType)) + 
  geom_density_ridges2(scale = 1, alpha=0.6) +
  theme_minimal(base_size = 14) + theme(axis.text.y = element_text(vjust = 0)) +
  scale_x_continuous(expand = c(0.01, 0)) +
  coord_cartesian(xlim = c(0, 200)) +  
  scale_y_discrete(expand = c(0.01, 0)) + 
  facet_grid(.~birdType) +
  theme_ridges() + 
  scale_fill_brewer(palette = 'Set1')

df() –> Shiny will know looking for a reactive element

ggplot(data = birdDS_Long, aes(x=birdDS_Long$measurement, y = boneAlone, fill = measurementType)) + 
  geom_density_ridges2(scale = 1, alpha=0.6) +
  theme_minimal(base_size = 14) + 
  theme(axis.text.y = element_text(vjust = 0)) +
  scale_x_continuous(expand = c(0.01, 0)) +
  coord_cartesian(xlim = c(0, 200)) +  
  scale_y_discrete(expand = c(0.01, 0)) + 
  facet_grid(.~birdType) +
  theme_ridges() + 
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1)) +
  theme(legend.position="none") +
  scale_fill_brewer(palette = 'Set1')

ggplot(data = birdDS_Long, aes(x=birdDS_Long$measurement, y = boneAlone, fill = birdType)) + 
  geom_density_ridges2(scale = 1, alpha=0.6) +
  theme_minimal(base_size = 14) + theme(axis.text.y = element_text(vjust = 0)) +
  scale_x_continuous(expand = c(0.01, 0)) +
  coord_cartesian(xlim = c(0, 200)) +  
  scale_y_discrete(expand = c(0.01, 0)) + 
  facet_grid(.~measurementType) +
  theme_ridges() + 
  scale_fill_brewer(palette = 'Set1')

birdsPlot <- ggplot(data = birdDS_Long, 
                    aes(x=birdDS_Long$measurement, 
                        y = birdType, 
                        fill = measurementType))
birdsPlot <- birdsPlot + geom_density_ridges2(scale = 0.9, alpha=0.7, colour = 'white', size = 0.1) +
  theme(axis.text.y = element_text(vjust = 0)) +
  #theme_minimal(base_size = 14) +
  scale_x_continuous(expand = c(0.01, 0)) +
  coord_cartesian(xlim = c(0, 150)) +  
  scale_y_discrete(expand = c(0.01, 0)) + 
  facet_grid(.~boneAlone) +
  theme(legend.title = element_blank()) +
  theme(legend.position='none') +
  scale_fill_brewer(palette = 'Set1')
birdsPlot <- birdsPlot + theme(panel.spacing=grid::unit(0.3,"lines"),
                       axis.text = element_text(size = rel(0.5)),
                       strip.text = element_text(face = "bold", size=11),
                       strip.text.x = element_text(margin = margin(.1, 0, .1, 0, "cm")),
                       strip.text.y = element_text(margin = margin(0, .1, 0, .1, "cm")))
birdsPlot + theme(panel.border = element_rect(fill = NA, colour = "grey30", size = 0.1))

ftp://cran.r-project.org/pub/R/web/packages/ggridges/ggridges.pdf https://cran.r-project.org/web/packages/ggridges/vignettes/introduction.html https://www.google.com.au/search?q=wading+bird&tbm=isch&tbs=rimg:CfS--S-sxOuTIjiEg6jXzItRbo17OwbSshNRNVFfCcDtU0dpbPuTdHhIPPiZ1rpRQtTnefQgkp7vHYWzZYeXipjB-ioSCYSDqNfMi1FuEcsNDMsvk7mOKhIJjXs7BtKyE1ERW94CeeqkqLQqEgk1UV8JwO1TRxGqQhRvUmio6yoSCWls-5N0eEg8ERo3BTsdCjmUKhIJ-JnWulFC1OcRdziC6XWUjHYqEgl59CCSnu8dhRFxPFMdGPZ7vSoSCbNlh5eKmMH6Eeof3qSS9Cgw&tbo=u&sa=X&ved=2ahUKEwjayMrayIDbAhXCyrwKHbidBKkQ9C96BAgBEBs&biw=1225&bih=1202&dpr=1

library(viridis)
birdsPlot <- ggplot(data = birdDS_Long, 
                    aes(x=birdDS_Long$measurement, 
                        y = birdType, 
                        fill = 0.5 - abs(0.5-..ecdf..)))
birdsPlot <- birdsPlot + stat_density_ridges(geom = "density_ridges_gradient", calc_ecdf = TRUE) +
  scale_fill_viridis(name = "Tail probability", direction = -1) +
  theme(axis.text.y = element_text(vjust = 0)) +
  theme_minimal(base_size = 14) +
  scale_x_continuous(expand = c(0.01, 0)) +
  coord_cartesian(xlim = c(0, 150)) +  
  scale_y_discrete(expand = c(0.01, 0)) + 
  facet_grid(.~bone) +
  theme(legend.title = element_blank()) +
  theme(legend.position='none') 
  scale_fill_brewer(palette = 'Set1')
<ggproto object: Class ScaleDiscrete, Scale>
    aesthetics: fill
    axis_order: function
    break_info: function
    break_positions: function
    breaks: waiver
    call: call
    clone: function
    dimension: function
    drop: TRUE
    expand: waiver
    get_breaks: function
    get_breaks_minor: function
    get_labels: function
    get_limits: function
    guide: legend
    is_discrete: function
    is_empty: function
    labels: waiver
    limits: NULL
    make_sec_title: function
    make_title: function
    map: function
    map_df: function
    n.breaks.cache: NULL
    na.translate: TRUE
    na.value: NA
    name: waiver
    palette: function
    palette.cache: NULL
    position: left
    range: <ggproto object: Class RangeDiscrete, Range>
        range: NULL
        reset: function
        train: function
        super:  <ggproto object: Class RangeDiscrete, Range>
    reset: function
    scale_name: brewer
    train: function
    train_df: function
    transform: function
    transform_df: function
    super:  <ggproto object: Class ScaleDiscrete, Scale>
birdsPlot <- birdsPlot + theme(panel.spacing=grid::unit(0.3,"lines"),
                       axis.text = element_text(size = rel(0.5)),
                       strip.text = element_text(face = "bold", size=11),
                       strip.text.x = element_text(margin = margin(.1, 0, .1, 0, "cm")),
                       strip.text.y = element_text(margin = margin(0, .1, 0, .1, "cm")))
birdsPlot + theme(panel.border = element_rect(fill = NA, colour = "grey30", size = 0.1))

Acknowledgements This dataset is provided by Dr. D. Liu of Beijing Museum of Natural History.

LS0tCnRpdGxlOiAiTUFUSDIyNzAgQXNzaWdubWVudCAyIgpzdWJ0aXRsZTogIlZpc3VhbGlzaW5nIE9wZW4gRGF0YSIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKPHN0eWxlPiBib2R5IHsgdGV4dC1hbGlnbjoganVzdGlmeX0gPC9zdHlsZT4KCiMjIFN0dWRlbnQgRGV0YWlscwoKKiBTdHVkZW50IE5hbWUgKHMzNjQ0MTE5KQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkKYGBgCgojIyBBYm91dAotLS0KaHR0cHM6Ly93d3cua2FnZ2xlLmNvbS96aGFuZ2p1ZWZlaS9iaXJkcy1ib25lcy1hbmQtbGl2aW5nLWhhYml0cwoKQ29udGV4dApUaGVyZSBhcmUgbWFueSBraW5kcyBvZiBiaXJkczogcGlnZW9ucywgZHVja3MsIG9zdHJpY2hlcywgcGVuZ3VpbnMuLi4gU29tZSBhcmUgZ29vZCBhdCBmbHlpbmcsIG90aGVycyBjYW4ndCBmbHkgYnV0IHJ1biBmYXN0LiBTb21lIHN3aW0gdW5kZXIgd2F0ZXIsIG90aGVycyB3YWRpbmcgaW4gc2hhbGxvdyBwb29sLgoKQWNjb3JkaW5nIHRvIHRoZWlyIGxpdmluZyBlbnZpcm9ubWVudHMgYW5kIGxpdmluZyBoYWJpdHMsIGJpcmRzIGFyZSBjbGFzc2lmaWVkIGludG8gZGlmZmVyZW50IGVjb2xvZ2ljYWwgZ3JvdXBzLiBUaGVyZSBhcmUgOCBlY29sb2dpY2FsIGdyb3VwcyBvZiBiaXJkczoKLS0tCiogU3dpbW1pbmcgQmlyZHMKKiBXYWRpbmcgQmlyZHMKKiBUZXJyZXN0cmlhbCBCaXJkcwoqIFJhcHRvcnMKKiBTY2Fuc29yaWFsIEJpcmRzCiogU2luZ2luZyBCaXJkcwoqIEN1cnNvcmlhbCBCaXJkcyAobm90IGluY2x1ZGVkIGluIGRhdGFzZXQpCiogTWFyaW5lIEJpcmRzIChub3QgaW5jbHVkZWQgaW4gZGF0YXNldCkKLS0tCgpGaXJzdCA2IGdyb3VwcyBhcmUgbWFpbiBhbmQgYXJlIGNvdmVyZWQgYnkgdGhpcyBkYXRhc2V0LgoKQXBwYXJlbnRseSwgYmlyZHMgYmVsb25nIHRvIGRpZmZlcmVudCBlY29sb2dpY2FsIGdyb3VwcyBoYXZlIGRpZmZlcmVudCBhcHBlYXJhbmNlczogZmx5aW5nIGJpcmRzIGhhdmUgc3Ryb25nIHdpbmdzIGFuZCB3YWRpbmcgYmlyZHMgaGF2ZSBsb25nIGxlZ3MuIFRoZWlyIGxpdmluZyBoYWJpdHMgYXJlIHNvbWV3aGF0IHJlZmxlY3RlZCBpbiB0aGVpciBib25lcycgc2hhcGVzLiBBcyBkYXRhIHNjaWVudGlzdHMgd2UgbWF5IHRoaW5rIG9mIGV4YW1pbmluZyB0aGUgdW5kZXJseWluZyByZWxhdGlvbnNoaXAgYmV0d2VlbiBzaXplcyBvZiBib25lcyBhbmQgZWNvbG9naWNhbCBncm91cHMgLCBhbmQgcmVjb2duaXNpbmcgYmlyZHMnIGVjb2xvZ2ljYWwgZ3JvdXBzIGJ5IHRoZWlyIGJvbmVzJyBzaGFwZXMuCgpDb250ZW50ClRoZXJlIGFyZSA0MjAgYmlyZHMgY29udGFpbmVkIGluIHRoaXMgZGF0YXNldC4gRWFjaCBiaXJkIGlzIHJlcHJlc2VudGVkIGJ5IDEwIG1lYXN1cmVtZW50cyAoZmVhdHVyZXMpOgotLS0KKiBMZW5ndGggYW5kIERpYW1ldGVyIG9mIEh1bWVydXMKKiBMZW5ndGggYW5kIERpYW1ldGVyIG9mIFVsbmEKKiBMZW5ndGggYW5kIERpYW1ldGVyIG9mIEZlbXVyCiogTGVuZ3RoIGFuZCBEaWFtZXRlciBvZiBUaWJpb3RhcnN1cwoqIExlbmd0aCBhbmQgRGlhbWV0ZXIgb2YgVGFyc29tZXRhdGFyc3VzCi0tLQpBbGwgbWVhc3VyZW1lbnRzIGFyZSBjb250aW51b3VzIGZsb2F0IG51bWJlcnMgKG1tKSB3aXRoIG1pc3NpbmcgdmFsdWVzIHJlcHJlc2VudGVkIGJ5IGVtcHR5IHN0cmluZ3MuIFRoZSBza2VsZXRvbnMgb2YgdGhpcyBkYXRhc2V0IGFyZSBjb2xsZWN0aW9ucyBvZiBOYXR1cmFsIEhpc3RvcnkgTXVzZXVtIG9mIExvcyBBbmdlbGVzIENvdW50eS4gVGhleSBiZWxvbmcgdG8gMjEgb3JkZXJzLCAxNTMgZ2VuZXJhLCAyNDUgc3BlY2llcy4KCkVhY2ggYmlyZCBoYXMgYSBsYWJlbCBmb3IgaXRzIGVjb2xvZ2ljYWwgZ3JvdXAKLS0tCiogU1c6IFN3aW1taW5nIEJpcmRzCiogVzogV2FkaW5nIEJpcmRzCiogVDogVGVycmVzdHJpYWwgQmlyZHMKKiBSOiBSYXB0b3JzCiogUDogU2NhbnNvcmlhbCBCaXJkcwoqIFNPOiBTaW5naW5nIEJpcmRzCi0tLQoKYGBge3J9CiMgTG9hZCB5b3VyIHBhY2thZ2VzCmxpYnJhcnkodGlkeXIpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkoR0dhbGx5KQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZ2dyaWRnZXMpCmBgYAoKIyMgRGF0YQoKYGBge3J9CiMgTG9hZCB5b3VyIGRhdGEgYW5kIHByZXBhcmUgZm9yIHZpc3VhbGlzYXRpb24KYmlyZERTIDwtIHJlYWQuY3N2KCJiaXJkLmNzdiIpCmBgYAoKIyMgRXhwbG9yaW5nIHRoZSBEYXRhCgpgYGB7cn0KIyBMb2FkIHlvdXIgZGF0YSBhbmQgcHJlcGFyZSBmb3IgdmlzdWFsaXNhdGlvbgpoZWFkKGJpcmREUykKYGBgCgpgYGB7cn0KIyBMb2FkIHlvdXIgZGF0YSBhbmQgcHJlcGFyZSBmb3IgdmlzdWFsaXNhdGlvbgpjb2xuYW1lcyhiaXJkRFMpCmBgYAoKYGBge3J9CmNvbE5hbWVzRnVsbCA8LSBjKCJJRCIsICJIdW1lcnVzTGVuZ3RoIiwgIkh1bWVydXNEaWFtZXRlciIsICJVbG5hTGVuZ3RoIiwgIlVsbmFEaWFtZXRlciIsCiAgICAgICAgICAgICAgICAgICJGZW11ckxlbmd0aCIsICJGZW11ckRpYW1ldGVyIiwgIlRpYmlvdGFydXNMZW5ndGgiLCAiVGliaW90YXJ1c0RpYW1ldGVyIiwKICAgICAgICAgICAgICAgICAgIlRhcnNvbWV0YXRhcnVzTGVuZ3RoIiwgIlRhcnNvbWV0YXRhcnVzRGlhbWV0ZXIiLCAiRWNvbG9naWNhbEJpcmRUeXBlIikKYGBgCgoKYGBge3J9CiMgTG9hZCB5b3VyIGRhdGEgYW5kIHByZXBhcmUgZm9yIHZpc3VhbGlzYXRpb24Kc3VtbWFyeShiaXJkRFMpCmBgYAoKYGBge3J9CiMgTG9hZCB5b3VyIGRhdGEgYW5kIHByZXBhcmUgZm9yIHZpc3VhbGlzYXRpb24Kc3RyKGJpcmREUykKYGBgCgpgYGB7cn0KIyBMb2FkIHlvdXIgZGF0YSBhbmQgcHJlcGFyZSBmb3IgdmlzdWFsaXNhdGlvbgpoZWFkKGJpcmREUykKYGBgCgpgYGB7cn0KIyBDaGVjayB0aGUgc3BlY2llcyBJRAp1bmlxdWUoYmlyZERTJHR5cGUpCmBgYAoKIyMjIyBEZXRlcm1pbmUgdGhlIG1lYW4gdmFsdWVzCgpgYGB7cn0KIyBEZXRlcm1pbmluZyB0aGUgbWVhbiB2YWx1ZXMKI21lYW5WYWx1ZUJ5VHlwZSA8LSBhZ2dyZWdhdGUoc3VydmV5c19jb21iaW5lZF95ZWFyJHdlaWdodCB+IHNwZWNpZXNfaWQsIAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cnZleXNfY29tYmluZWRfeWVhciwgbWVhbiwgbmEuYWN0aW9uID0gbmEub21pdCkKYGBgCgpgYGB7cn0KIyBDaGVja2luZyB0aGUgb3V0cHV0CiNhdmVyYWdlX2J5X3NwZWNpZXNfeWVhcgpgYGAKCmBgYHtyfQojIFNXIC0gU3dpbW1pbmcgQmlyZHMKU1diaXJkcyA8LSBzdWJzZXQoYmlyZERTLCBiaXJkRFMkdHlwZSA9PSAiU1ciKSAjIFNXIC0gU3dpbW1pbmcgQmlyZHMKV2JpcmRzIDwtIHN1YnNldChiaXJkRFMsIGJpcmREUyR0eXBlID09ICJXIikgIyBXIC0gV2FkaW5nIEJpcmRzClRiaXJkcyA8LSBzdWJzZXQoYmlyZERTLCBiaXJkRFMkdHlwZSA9PSAiVCIpICMgVCAtIFRlcnJlc3RyaWFsIEJpcmRzClJiaXJkcyA8LSBzdWJzZXQoYmlyZERTLCBiaXJkRFMkdHlwZSA9PSAiUiIpICMgUiAtIFJhcHRvcnMKUGJpcmRzIDwtIHN1YnNldChiaXJkRFMsIGJpcmREUyR0eXBlID09ICJQIikgIyBQIC0gU2NhbnNvcmlhbCBCaXJkcwpTT2JpcmRzIDwtIHN1YnNldChiaXJkRFMsIGJpcmREUyR0eXBlID09ICJTTyIpICMgU08gLSBTaW5naW5nIEJpcmRzCmBgYAoKYGBge3J9CnN1bW1hcnkoU1diaXJkcykKc3VtbWFyeShXYmlyZHMpICMgVHdvIE5BCnN1bW1hcnkoVGJpcmRzKSAKc3VtbWFyeShSYmlyZHMpICMgRm91ciBOQQpzdW1tYXJ5KFBiaXJkcykKc3VtbWFyeShTT2JpcmRzKSAjIE5pbmUgTkEKYGBgCgpgYGB7cn0KIyBGaWxsaW5nIE5BIC0gUmJpcmRzCldiaXJkcyRmZW1sW2lzLm5hKFdiaXJkcyRmZW1sKV0gPC0gbWVhbihXYmlyZHMkZmVtbCwgbmEucm0gPSBUUlVFKQpXYmlyZHMkZmVtd1tpcy5uYShXYmlyZHMkZmVtdyldIDwtIG1lYW4oV2JpcmRzJGZlbXcsIG5hLnJtID0gVFJVRSkKYGBgCgpgYGB7cn0KIyBGaWxsaW5nIE5BIC0gUmJpcmRzClJiaXJkcyR1bG5hbFtpcy5uYShSYmlyZHMkdWxuYWwpXSA8LSBtZWFuKFJiaXJkcyR1bG5hbCwgbmEucm0gPSBUUlVFKQpSYmlyZHMkdWxuYXdbaXMubmEoUmJpcmRzJHVsbmF3KV0gPC0gbWVhbihSYmlyZHMkdWxuYXcsIG5hLnJtID0gVFJVRSkKUmJpcmRzJHRhcmxbaXMubmEoUmJpcmRzJHRhcmwpXSA8LSBtZWFuKFJiaXJkcyR0YXJsLCBuYS5ybSA9IFRSVUUpClJiaXJkcyR0YXJ3W2lzLm5hKFJiaXJkcyR0YXJ3KV0gPC0gbWVhbihSYmlyZHMkdGFydywgbmEucm0gPSBUUlVFKQpgYGAKCmBgYHtyfQojIEZpbGxpbmcgTkEgLSBTT2JpcmRzClNPYmlyZHMkaHVtbFtpcy5uYShTT2JpcmRzJGh1bWwpXSA8LSBtZWFuKFNPYmlyZHMkaHVtbCwgbmEucm0gPSBUUlVFKQpTT2JpcmRzJGh1bXdbaXMubmEoU09iaXJkcyRodW13KV0gPC0gbWVhbihTT2JpcmRzJGh1bXcsIG5hLnJtID0gVFJVRSkKU09iaXJkcyR1bG5hbFtpcy5uYShTT2JpcmRzJHVsbmFsKV0gPC0gbWVhbihTT2JpcmRzJHVsbmFsLCBuYS5ybSA9IFRSVUUpClNPYmlyZHMkdWxuYXdbaXMubmEoU09iaXJkcyR1bG5hdyldIDwtIG1lYW4oU09iaXJkcyR1bG5hdywgbmEucm0gPSBUUlVFKQpTT2JpcmRzJGZlbWxbaXMubmEoU09iaXJkcyRmZW1sKV0gPC0gbWVhbihTT2JpcmRzJGZlbWwsIG5hLnJtID0gVFJVRSkKU09iaXJkcyR0aWJsW2lzLm5hKFNPYmlyZHMkdGlibCldIDwtIG1lYW4oU09iaXJkcyR0aWJsLCBuYS5ybSA9IFRSVUUpClNPYmlyZHMkdGlid1tpcy5uYShTT2JpcmRzJHRpYncpXSA8LSBtZWFuKFNPYmlyZHMkdGlidywgbmEucm0gPSBUUlVFKQpgYGAKCmBgYHtyfQpiaXJkRFNfY2xlYW4gPC0gcmJpbmQoU1diaXJkcywgV2JpcmRzLCBUYmlyZHMsIFJiaXJkcywgUGJpcmRzLCBTT2JpcmRzKQpgYGAKCmBgYHtyfQpzdW1tYXJ5KGJpcmREU19jbGVhbikKYGBgCgpgYGB7cn0KZ2dwbG90KGRhdGEgPSBiaXJkRFNfY2xlYW4sIGFlcyh4ID0gdHlwZSwgeSA9IGh1bWwpKSArIGdlb21fYm94cGxvdCgpCmBgYAoKYGBge3J9CmdncGxvdChkYXRhID0gYmlyZERTX2NsZWFuLCBhZXMoeCA9IHR5cGUsIHkgPSBodW13KSkgKyBnZW9tX2JveHBsb3QoKQpgYGAKCmBgYHtyfQpnZ3Bsb3QoZGF0YSA9IGJpcmREU19jbGVhbiwgYWVzKHggPSB0eXBlLCB5ID0gdWxuYWwpKSArIGdlb21fYm94cGxvdCgpCmBgYAoKYGBge3J9CmdncGxvdChkYXRhID0gYmlyZERTX2NsZWFuLCBhZXMoeCA9IHR5cGUsIHkgPSB1bG5hdykpICsgZ2VvbV9ib3hwbG90KCkKYGBgCgpgYGB7cn0KZ2dwbG90KGRhdGEgPSBiaXJkRFNfY2xlYW4sIGFlcyh4ID0gdHlwZSwgeSA9IGZlbWwpKSArIGdlb21fYm94cGxvdCgpCmBgYAoKYGBge3J9CmdncGxvdChkYXRhID0gYmlyZERTX2NsZWFuLCBhZXMoeCA9IHR5cGUsIHkgPSBmZW13KSkgKyBnZW9tX2JveHBsb3QoKQpgYGAKCgoKCgojIENvdWxkIHNwbGl0IG91dCB0aGUgbGVuZ3RoIGFuZCB3aWR0aCB2YXJpYWJsZXMuLi4KCiMjIFZpc3VhbGlzYXRpb24KCmBgYHtyfQpjb2xuYW1lcyhiaXJkRFNfY2xlYW4pCmBgYAoKYGBge3J9CmFsbE1lYXN1cmVtZW50cyA8LSBjKCJodW1sIiwgImh1bXciLCAidWxuYWwiLCAidWxuYXciLCAiZmVtbCIsICAiZmVtdyIsICAidGlibCIsICAidGlidyIsICAidGFybCIsICAidGFydyIpCmxlbmd0aE1lYXN1cmVtZW50cyA8LSBjKCJodW1sIiwgInVsbmFsIiwgImZlbWwiLCAgInRpYmwiLCAgInRhcmwiKQp3aWR0aE1lYXN1cmVtZW50cyA8LSBjKCJodW13IiwgInVsbmF3IiwgICJmZW13IiwgInRpYnciLCAidGFydyIpCmBgYAoKCgpgYGB7cn0KIyBWaXN1YWxpc2UgWW91ciBEYXRhCnNjYXR0ZXJfbWF0cml4IDwtIGdncGFpcnMoZGF0YSA9IGJpcmREU19jbGVhbiwKICAgICAgICBjb2x1bW5zID0gYWxsTWVhc3VyZW1lbnRzLAogICAgICAgIG1hcHBpbmcgPSBhZXMoY29sb3VyID0gdHlwZSksCiAgICAgICAgZGlhZyA9IGxpc3QoY29udGludW91cyA9IHdyYXAoImRlbnNpdHlEaWFnIiwgYWxwaGE9SSgwLjEpKSwgbWFwcGluZyA9IGdncGxvdDI6OmFlcyhmaWxsPXR5cGUpKSwKICAgICAgICB1cHBlciA9IGxpc3QoY29udGludW91cyA9IHdyYXAoImRlbnNpdHkiLCBhbHBoYSA9IEkoMC41KSksIGNvbWJvID0gImJveCIpLAogICAgICAgIGxvd2VyID0gbGlzdChjb250aW51b3VzID0gd3JhcCgicG9pbnRzIiwgYWxwaGEgPSBJKDAuNCksIHNpemUgPSAwLjEpKSkKc2NhdHRlcl9tYXRyaXhfYWRqdXN0ZWQgPC0gc2NhdHRlcl9tYXRyaXggKyB0aGVtZShwYW5lbC5zcGFjaW5nPWdyaWQ6OnVuaXQoMCwibGluZXMiKSwKICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCgwLjUpKSwKICAgICAgICAgICAgICAgICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHNpemU9NyksCiAgICAgICAgICAgICAgICAgICAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KG1hcmdpbiA9IG1hcmdpbiguMSwgMCwgLjEsIDAsICJjbSIpKSwKICAgICAgICAgICAgICAgICAgICAgICBzdHJpcC50ZXh0LnkgPSBlbGVtZW50X3RleHQobWFyZ2luID0gbWFyZ2luKDAsIC4xLCAwLCAuMSwgImNtIikpKQpzY2F0dGVyX21hdHJpeF9hZGp1c3RlZCArIHRoZW1lKHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChmaWxsID0gTkEsIGNvbG91ciA9ICJncmV5MzAiLCBzaXplID0gMC4yKSkKYGBgCgpgYGB7cn0KIyBWaXN1YWxpc2UgWW91ciBEYXRhCnNjYXR0ZXJfbWF0cml4X2xlbmd0aCA8LSBnZ3BhaXJzKGRhdGEgPSBiaXJkRFNfY2xlYW4sCiAgICAgICAgY29sdW1ucyA9IGxlbmd0aE1lYXN1cmVtZW50cywKICAgICAgICBtYXBwaW5nID0gYWVzKGNvbG91ciA9IHR5cGUpLAogICAgICAgIGRpYWcgPSBsaXN0KGNvbnRpbnVvdXMgPSB3cmFwKCJkZW5zaXR5RGlhZyIsIGFscGhhPUkoMC4xKSksIG1hcHBpbmcgPSBnZ3Bsb3QyOjphZXMoZmlsbD10eXBlKSksCiAgICAgICAgdXBwZXIgPSBsaXN0KGNvbnRpbnVvdXMgPSB3cmFwKCJkZW5zaXR5IiwgYWxwaGEgPSBJKDAuNSkpLCBjb21ibyA9ICJib3giKSwKICAgICAgICBsb3dlciA9IGxpc3QoY29udGludW91cyA9IHdyYXAoInBvaW50cyIsIGFscGhhID0gSSgwLjQpLCBzaXplID0gMC4xKSkpCnNjYXR0ZXJfbWF0cml4X2xlbmd0aF9hZGp1c3RlZCA8LSBzY2F0dGVyX21hdHJpeF9sZW5ndGggKyB0aGVtZShwYW5lbC5zcGFjaW5nPWdyaWQ6OnVuaXQoMCwibGluZXMiKSwKICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCgwLjUpKSwKICAgICAgICAgICAgICAgICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHNpemU9NyksCiAgICAgICAgICAgICAgICAgICAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KG1hcmdpbiA9IG1hcmdpbiguMSwgMCwgLjEsIDAsICJjbSIpKSwKICAgICAgICAgICAgICAgICAgICAgICBzdHJpcC50ZXh0LnkgPSBlbGVtZW50X3RleHQobWFyZ2luID0gbWFyZ2luKDAsIC4xLCAwLCAuMSwgImNtIikpKQpzY2F0dGVyX21hdHJpeF9sZW5ndGhfYWRqdXN0ZWQgKyB0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbCA9IE5BLCBjb2xvdXIgPSAiZ3JleTMwIiwgc2l6ZSA9IDAuMikpCmBgYAoKYGBge3J9CiMgVmlzdWFsaXNlIFlvdXIgRGF0YQpzY2F0dGVyX21hdHJpeF93aWR0aCA8LSBnZ3BhaXJzKGRhdGEgPSBiaXJkRFNfY2xlYW4sCiAgICAgICAgY29sdW1ucyA9IHdpZHRoTWVhc3VyZW1lbnRzLAogICAgICAgIG1hcHBpbmcgPSBhZXMoY29sb3VyID0gdHlwZSksCiAgICAgICAgZGlhZyA9IGxpc3QoY29udGludW91cyA9IHdyYXAoImRlbnNpdHlEaWFnIiwgYWxwaGE9SSgwLjEpKSwgbWFwcGluZyA9IGdncGxvdDI6OmFlcyhmaWxsPXR5cGUpKSwKICAgICAgICB1cHBlciA9IGxpc3QoY29udGludW91cyA9IHdyYXAoImRlbnNpdHkiLCBhbHBoYSA9IEkoMC41KSksIGNvbWJvID0gImJveCIpLAogICAgICAgIGxvd2VyID0gbGlzdChjb250aW51b3VzID0gd3JhcCgicG9pbnRzIiwgYWxwaGEgPSBJKDAuNCksIHNpemUgPSAwLjEpKSkKc2NhdHRlcl9tYXRyaXhfd2lkdGhfYWRqdXN0ZWQgPC0gc2NhdHRlcl9tYXRyaXhfd2lkdGggKyB0aGVtZShwYW5lbC5zcGFjaW5nPWdyaWQ6OnVuaXQoMCwibGluZXMiKSwKICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCgwLjUpKSwKICAgICAgICAgICAgICAgICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHNpemU9NyksCiAgICAgICAgICAgICAgICAgICAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KG1hcmdpbiA9IG1hcmdpbiguMSwgMCwgLjEsIDAsICJjbSIpKSwKICAgICAgICAgICAgICAgICAgICAgICBzdHJpcC50ZXh0LnkgPSBlbGVtZW50X3RleHQobWFyZ2luID0gbWFyZ2luKDAsIC4xLCAwLCAuMSwgImNtIikpKQpzY2F0dGVyX21hdHJpeF93aWR0aF9hZGp1c3RlZCArIHRoZW1lKHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChmaWxsID0gTkEsIGNvbG91ciA9ICJncmV5MzAiLCBzaXplID0gMC4yKSkKYGBgCgoqIFNXOiBTd2ltbWluZyBCaXJkcwoqIFc6IFdhZGluZyBCaXJkcwoqIFQ6IFRlcnJlc3RyaWFsIEJpcmRzCiogUjogUmFwdG9ycwoqIFA6IFNjYW5zb3JpYWwgQmlyZHMKKiBTTzogU2luZ2luZyBCaXJkcwoKYGBge3J9CiMgRGlkIG5vdCB3b3JrCnRlc3RfcmVvcmRlciA8LSBiaXJkRFNfY2xlYW5bLGMoMTIsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEpXQpgYGAKCmBgYHtyfQojIERpZCBub3Qgd29yawp0ZXN0IDwtIGJpcmREU19jbGVhbiAlPiUgZ2F0aGVyKCJodW1sIiwgImh1bXciLCAidWxuYWwiLCAidWxuYXciLCAiZmVtbCIsICAiZmVtdyIsICAidGlibCIsICAidGlidyIsICAidGFybCIsICAidGFydyIsIAogICAgICAgICAgICAgICAgICAga2V5ID0gImlkIiwgdmFsdWUgPSAibWVhc3VyZW1lbnQiKQpgYGAKCmBgYHtyfQojZGltKFNXYmlyZHMpICMgTCA9IDExNiAqIAojZGltKFdiaXJkcykgIyBMID0gNjUKI2RpbShUYmlyZHMpCiNkaW0oUmJpcmRzKQojZGltKFBiaXJkcykKI2RpbShTT2JpcmRzKSAKCgpTV2JpcmRzTG9uZyA8LSBTV2JpcmRzICU+JSBnYXRoZXIoImh1bWwiLCAiaHVtdyIsICJ1bG5hbCIsICJ1bG5hdyIsICJmZW1sIiwgICJmZW13IiwgICJ0aWJsIiwgICJ0aWJ3IiwgICJ0YXJsIiwgICJ0YXJ3IiwgCiAgICAgICAgICAgICAgICAgICBrZXkgPSAidHlwZSIsIHZhbHVlID0gIm1lYXN1cmVtZW50IikKU1diaXJkc0xvbmckaWQgPC0gJ1NXJwpXYmlyZHNMb25nIDwtIFdiaXJkcyAlPiUgZ2F0aGVyKCJodW1sIiwgImh1bXciLCAidWxuYWwiLCAidWxuYXciLCAiZmVtbCIsICAiZmVtdyIsICAidGlibCIsICAidGlidyIsICAidGFybCIsICAidGFydyIsIAogICAgICAgICAgICAgICAgICAga2V5ID0gInR5cGUiLCB2YWx1ZSA9ICJtZWFzdXJlbWVudCIpCldiaXJkc0xvbmckaWQgPC0gJ1cnClRiaXJkc0xvbmcgPC0gVGJpcmRzICU+JSBnYXRoZXIoImh1bWwiLCAiaHVtdyIsICJ1bG5hbCIsICJ1bG5hdyIsICJmZW1sIiwgICJmZW13IiwgICJ0aWJsIiwgICJ0aWJ3IiwgICJ0YXJsIiwgICJ0YXJ3IiwgCiAgICAgICAgICAgICAgICAgICBrZXkgPSAidHlwZSIsIHZhbHVlID0gIm1lYXN1cmVtZW50IikKVGJpcmRzTG9uZyRpZCA8LSAnVCcKUmJpcmRzTG9uZyA8LSBSYmlyZHMgJT4lIGdhdGhlcigiaHVtbCIsICJodW13IiwgInVsbmFsIiwgInVsbmF3IiwgImZlbWwiLCAgImZlbXciLCAgInRpYmwiLCAgInRpYnciLCAgInRhcmwiLCAgInRhcnciLCAKICAgICAgICAgICAgICAgICAgIGtleSA9ICJ0eXBlIiwgdmFsdWUgPSAibWVhc3VyZW1lbnQiKQpSYmlyZHNMb25nJGlkIDwtICdSJwpQYmlyZHNMb25nIDwtIFBiaXJkcyAlPiUgZ2F0aGVyKCJodW1sIiwgImh1bXciLCAidWxuYWwiLCAidWxuYXciLCAiZmVtbCIsICAiZmVtdyIsICAidGlibCIsICAidGlidyIsICAidGFybCIsICAidGFydyIsIAogICAgICAgICAgICAgICAgICAga2V5ID0gInR5cGUiLCB2YWx1ZSA9ICJtZWFzdXJlbWVudCIpClBiaXJkc0xvbmckaWQgPC0gJ1AnClNPYmlyZHNMb25nIDwtIFNPYmlyZHMgJT4lIGdhdGhlcigiaHVtbCIsICJodW13IiwgInVsbmFsIiwgInVsbmF3IiwgImZlbWwiLCAgImZlbXciLCAgInRpYmwiLCAgInRpYnciLCAgInRhcmwiLCAgInRhcnciLCAKICAgICAgICAgICAgICAgICAgIGtleSA9ICJ0eXBlIiwgdmFsdWUgPSAibWVhc3VyZW1lbnQiKQpTT2JpcmRzTG9uZyRpZCA8LSAnU08nCmBgYAoKYGBge3J9CmJpcmREU19Mb25nIDwtIHJiaW5kKFNXYmlyZHNMb25nLCBXYmlyZHNMb25nLCBUYmlyZHNMb25nLCBSYmlyZHNMb25nLCBQYmlyZHNMb25nLCBTT2JpcmRzTG9uZykKYGBgCgpgYGB7cn0Kc3VtbWFyeShiaXJkRFNfTG9uZykKYGBgCgpgYGB7cn0KY29sbmFtZXMoYmlyZERTX0xvbmcpIDwtIGMoImJpcmRUeXBlIiwgImJvbmUiLCAibWVhc3VyZW1lbnQiKQpgYGAKCgpgYGB7cn0KZ2dOZXcgPC0gZ2dwbG90KGRhdGEgPSBiaXJkRFNfTG9uZywgYWVzKHg9YmlyZERTX0xvbmckbWVhc3VyZW1lbnQsIHkgPSBib25lLCBmaWxsID0gYmlyZFR5cGUpKQpnZ05ldyArIGdlb21fZGVuc2l0eV9yaWRnZXMoYWVzKHggPSBib25lKSwgCiAgICAgICAgICAgYWxwaGEgPSAuOCwgY29sb3IgPSAid2hpdGUiKSArCiAgdGhlbWVfcmlkZ2VzKGdyaWQgPSBGQUxTRSkKYGBgCgpgYGB7cn0KZ2dOZXcgPC0gZ2dwbG90KGRhdGEgPSBiaXJkRFNfTG9uZywgYWVzKHg9YmlyZERTX0xvbmckbWVhc3VyZW1lbnQsIHkgPSBiaXJkVHlwZSwgZmlsbCA9IGJvbmUpKQpnZ05ldyArIGdlb21fZGVuc2l0eV9yaWRnZXMoYWVzKHggPSBib25lKSwgCiAgICAgICAgICAgYWxwaGEgPSAuOCwgY29sb3IgPSAid2hpdGUiKSArCiAgdGhlbWVfcmlkZ2VzKGdyaWQgPSBGQUxTRSkKYGBgCgpgYGB7cn0KZ2dOZXcgPC0gZ2dwbG90KGRhdGEgPSBiaXJkRFNfTG9uZywgYWVzKHg9YmlyZERTX0xvbmckbWVhc3VyZW1lbnQsIHkgPSBiaXJkVHlwZSwgZmlsbCA9IGJvbmUpKQpnZ05ldyArIGdlb21fZGVuc2l0eV9yaWRnZXMoYWVzKHggPSBtZWFzdXJlbWVudCksIGFscGhhID0gLjgsIGNvbG9yID0gIndoaXRlIikgKwogIHRoZW1lX3JpZGdlcyhncmlkID0gRkFMU0UpCmBgYAoKYGBge3J9CmdnTmV3IDwtIGdncGxvdChkYXRhID0gYmlyZERTX0xvbmcsIGFlcyh4PWJpcmREU19Mb25nJG1lYXN1cmVtZW50LCB5ID0gYm9uZSwgZmlsbCA9IGJpcmRUeXBlKSkKZ2dOZXcgKyBnZW9tX2RlbnNpdHlfcmlkZ2VzKGFlcyh4ID0gbWVhc3VyZW1lbnQpLCBhbHBoYSA9IC44LCBjb2xvciA9ICJ3aGl0ZSIpICsKICB0aGVtZV9yaWRnZXMoZ3JpZCA9IEZBTFNFKQpgYGAKCmBgYHtyfQpnZ3Bsb3QoZGF0YSA9IGJpcmREU19Mb25nLCBhZXMoeD1iaXJkRFNfTG9uZyRtZWFzdXJlbWVudCwgeSA9IGJvbmUsIGZpbGwgPSBiaXJkVHlwZSkpICsgCiAgIGdlb21fZGVuc2l0eV9yaWRnZXMyKHNjYWxlID0gMSkgKwogICB0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZSA9IDE0KSArIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHZqdXN0ID0gMCkpICsKICAgc2NhbGVfeF9jb250aW51b3VzKGV4cGFuZCA9IGMoMC4wMSwgMCkpICsKICAgY29vcmRfY2FydGVzaWFuKHhsaW0gPSBjKDAsIDIwMCkpICsgIAogICBzY2FsZV95X2Rpc2NyZXRlKGV4cGFuZCA9IGMoMC4wMSwgMCkpCgpgYGAKCgpgYGB7cn0KZ2dwbG90KGRhdGEgPSBiaXJkRFNfTG9uZywgYWVzKHg9YmlyZERTX0xvbmckbWVhc3VyZW1lbnQsIHkgPSBib25lLCBmaWxsID0gYmlyZFR5cGUpKSArIAogICBnZW9tX2RlbnNpdHlfcmlkZ2VzMihzY2FsZSA9IDEpICsKICAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxNCkgKyB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dCh2anVzdCA9IDApKSArCiAgIHNjYWxlX3hfY29udGludW91cyhleHBhbmQgPSBjKDAuMDEsIDApKSArCiAgIGNvb3JkX2NhcnRlc2lhbih4bGltID0gYygwLCAyMDApKSArICAKICAgc2NhbGVfeV9kaXNjcmV0ZShleHBhbmQgPSBjKDAuMDEsIDApKSArIAogIGZhY2V0X2dyaWQoLn5iaXJkVHlwZSkKYGBgCgpgYGB7cn0KZ2dwbG90KGRhdGEgPSBiaXJkRFNfTG9uZywgYWVzKHg9YmlyZERTX0xvbmckbWVhc3VyZW1lbnQsIHkgPSBiaXJkVHlwZSwgZmlsbCA9IGJvbmUpKSArIAogICBnZW9tX2RlbnNpdHlfcmlkZ2VzMihzY2FsZSA9IDEpICsKICAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxNCkgKyB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dCh2anVzdCA9IDApKSArCiAgIHNjYWxlX3hfY29udGludW91cyhleHBhbmQgPSBjKDAuMDEsIDApKSArCiAgIGNvb3JkX2NhcnRlc2lhbih4bGltID0gYygwLCAyMDApKSArICAKICAgc2NhbGVfeV9kaXNjcmV0ZShleHBhbmQgPSBjKDAuMDEsIDApKSArIAogIGZhY2V0X2dyaWQoLn5ib25lKQpgYGAKCgpodHRwOi8vZGF2ZW1jZy5naXRodWIuaW8vcG9zdC9sZXQtcy1wbG90LTUtcmlkZ2VsaW5lLWRlbnNpdHktcGxvdHMvCmh0dHBzOi8vZmVlZHlldGkuY29tL2hhc2h0YWcucGhwP3E9Z2dyaWRnZXMKaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNDYwMTI5NTEvdGVtcGVyYXR1cmUtcGxvdC1lcnJvci1pbi1mdW54aS1vYmplY3QteS1ub3QtZm91bmQKaHR0cDovL3d3dy5jb29rYm9vay1yLmNvbS9HcmFwaHMvQ29sb3JzXyhnZ3Bsb3QyKS8gIyBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlPSJTcGVjdHJhbCIpCmh0dHA6Ly9nZ3Bsb3QyLnRpZHl2ZXJzZS5vcmcvcmVmZXJlbmNlL3NjYWxlX2JyZXdlci5odG1sCmh0dHA6Ly93d3cuc3RhdC5jb2x1bWJpYS5lZHUvfnR6aGVuZy9maWxlcy9SY29sb3IucGRmCmh0dHA6Ly9jbGF5Zm9yZC5naXRodWIuaW8vZHdpci9kd3JfMDVfY29tYmluZV9tZXJnZV9yZWhzYXBlX2RhdGEuaHRtbApodHRwczovL3R3aXR0ZXIuY29tL0BlYXRvbmp3Cmh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQ2MDEyOTUxL3RlbXBlcmF0dXJlLXBsb3QtZXJyb3ItaW4tZnVueGktb2JqZWN0LXktbm90LWZvdW5kCmh0dHBzOi8vZmVlZHlldGkuY29tL2hhc2h0YWcucGhwP3E9Z2dqb3kKaHR0cHM6Ly9ob21lcGFnZS5kaXZtcy51aW93YS5lZHUvfmx1a2UvY2xhc3Nlcy9TVEFUNDU4MC9ib3hldGMuaHRtbApodHRwczovL3podWFubGFuLnpoaWh1LmNvbS9wLzMyMTE1NzcyIAoKCmBgYHtyfQpnZ3Bsb3QoZGF0YSA9IGJpcmREU19Mb25nLCBhZXMoeD1iaXJkRFNfTG9uZyRtZWFzdXJlbWVudCwgeSA9IGJpcmRUeXBlLCBmaWxsID0gYm9uZSkpICsgCiAgZ2VvbV9kZW5zaXR5X3JpZGdlcyhhbHBoYT0wLjYpICsgCiAgY29vcmRfY2FydGVzaWFuKHhsaW0gPSBjKDAsIDIwMCkpICsgIAogIHRoZW1lX3JpZGdlcygpICsgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICdTZXQxJykKYGBgCgoKYGBge3J9CiMgTmVlZCB0byBhZGQgdHdvIEJPT0xFQU4gY29sdW1ucwojIE9SCiMgTGVuZ3RoIGFuZCBXaWR0aCBpbiBvbmUgY29sdW1uLi4uICh0aGlzISkKYmlyZERTX0xvbmckbWVhc3VyZW1lbnRUeXBlIDwtIHNhcHBseShzdHJzcGxpdChhcy5jaGFyYWN0ZXIoYmlyZERTX0xvbmckYm9uZSksICIiKSwgdGFpbCwgMSkKCmJpcmREU19Mb25nJGJvbmVBbG9uZSA9IHN1YnN0cihiaXJkRFNfTG9uZyRib25lLDEsbmNoYXIoYmlyZERTX0xvbmckYm9uZSktMSkKCihhZXMoeSA9IERydWcsIHg9bG9nMihBcmVhKSwgZ3JvdXA9V2VsbC5uYW1lcywgZmlsbD1ETVNPKSkKCmBgYAoKYGBge3J9CmdncGxvdChkYXRhID0gYmlyZERTX0xvbmcsIGFlcyh4PWJpcmREU19Mb25nJG1lYXN1cmVtZW50LCB5ID0gYmlyZFR5cGUsIGZpbGwgPSBtZWFzdXJlbWVudFR5cGUpKSArIAogICBnZW9tX2RlbnNpdHlfcmlkZ2VzMihzY2FsZSA9IDEpICsKICAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxNCkgKyB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dCh2anVzdCA9IDApKSArCiAgIHNjYWxlX3hfY29udGludW91cyhleHBhbmQgPSBjKDAuMDEsIDApKSArCiAgIGNvb3JkX2NhcnRlc2lhbih4bGltID0gYygwLCAyMDApKSArICAKICAgc2NhbGVfeV9kaXNjcmV0ZShleHBhbmQgPSBjKDAuMDEsIDApKSArIAogIGZhY2V0X2dyaWQoLn5ib25lQWxvbmUpCmBgYAoKYGBge3J9CmdncGxvdChkYXRhID0gYmlyZERTX0xvbmcsIGFlcyh4PWJpcmREU19Mb25nJG1lYXN1cmVtZW50LCB5ID0gYm9uZUFsb25lLCBmaWxsID0gbWVhc3VyZW1lbnRUeXBlKSkgKyAKICAgZ2VvbV9kZW5zaXR5X3JpZGdlczIoc2NhbGUgPSAxKSArCiAgIHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gMTQpICsgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQodmp1c3QgPSAwKSkgKwogICBzY2FsZV94X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLjAxLCAwKSkgKwogICBjb29yZF9jYXJ0ZXNpYW4oeGxpbSA9IGMoMCwgMjAwKSkgKyAgCiAgIHNjYWxlX3lfZGlzY3JldGUoZXhwYW5kID0gYygwLjAxLCAwKSkgKyAKICBmYWNldF9ncmlkKC5+YmlyZFR5cGUpCmBgYAoKCmBgYHtyfQpnZ3Bsb3QoZGF0YSA9IGJpcmREU19Mb25nLCBhZXMoeD1iaXJkRFNfTG9uZyRtZWFzdXJlbWVudCwgeSA9IGJvbmVBbG9uZSwgZmlsbCA9IG1lYXN1cmVtZW50VHlwZSkpICsgCiAgZ2VvbV9kZW5zaXR5X3JpZGdlczIoc2NhbGUgPSAxLCBhbHBoYT0wLjYpICsKICB0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZSA9IDE0KSArIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHZqdXN0ID0gMCkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLjAxLCAwKSkgKwogIGNvb3JkX2NhcnRlc2lhbih4bGltID0gYygwLCAyMDApKSArICAKICBzY2FsZV95X2Rpc2NyZXRlKGV4cGFuZCA9IGMoMC4wMSwgMCkpICsgCiAgZmFjZXRfZ3JpZCgufmJpcmRUeXBlKSArCiAgdGhlbWVfcmlkZ2VzKCkgKyAKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gJ1NldDEnKQpgYGAKCgpkZigpIC0tPiBTaGlueSB3aWxsIGtub3cgbG9va2luZyBmb3IgYSByZWFjdGl2ZSBlbGVtZW50IAoKCmBgYHtyfQpnZ3Bsb3QoZGF0YSA9IGJpcmREU19Mb25nLCBhZXMoeD1iaXJkRFNfTG9uZyRtZWFzdXJlbWVudCwgeSA9IGJvbmVBbG9uZSwgZmlsbCA9IG1lYXN1cmVtZW50VHlwZSkpICsgCiAgZ2VvbV9kZW5zaXR5X3JpZGdlczIoc2NhbGUgPSAxLCBhbHBoYT0wLjYpICsKICB0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZSA9IDE0KSArIAogIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHZqdXN0ID0gMCkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLjAxLCAwKSkgKwogIGNvb3JkX2NhcnRlc2lhbih4bGltID0gYygwLCAyMDApKSArICAKICBzY2FsZV95X2Rpc2NyZXRlKGV4cGFuZCA9IGMoMC4wMSwgMCkpICsgCiAgZmFjZXRfZ3JpZCgufmJpcmRUeXBlKSArCiAgdGhlbWVfcmlkZ2VzKCkgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCB2anVzdCA9IDAuNSwgaGp1c3Q9MSkpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICdTZXQxJykKYGBgCgoKYGBge3J9CmdncGxvdChkYXRhID0gYmlyZERTX0xvbmcsIGFlcyh4PWJpcmREU19Mb25nJG1lYXN1cmVtZW50LCB5ID0gYm9uZUFsb25lLCBmaWxsID0gYmlyZFR5cGUpKSArIAogIGdlb21fZGVuc2l0eV9yaWRnZXMyKHNjYWxlID0gMSwgYWxwaGE9MC42KSArCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxNCkgKyB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dCh2anVzdCA9IDApKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGV4cGFuZCA9IGMoMC4wMSwgMCkpICsKICBjb29yZF9jYXJ0ZXNpYW4oeGxpbSA9IGMoMCwgMjAwKSkgKyAgCiAgc2NhbGVfeV9kaXNjcmV0ZShleHBhbmQgPSBjKDAuMDEsIDApKSArIAogIGZhY2V0X2dyaWQoLn5tZWFzdXJlbWVudFR5cGUpICsKICB0aGVtZV9yaWRnZXMoKSArIAogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAnU2V0MScpCmBgYAoKYGBge3J9CmdncGxvdChkYXRhID0gYmlyZERTX0xvbmcsIGFlcyh4PWJpcmREU19Mb25nJG1lYXN1cmVtZW50LCB5ID0gYmlyZFR5cGUsIGZpbGwgPSBib25lQWxvbmUpKSArIAogIGdlb21fZGVuc2l0eV9yaWRnZXMyKHNjYWxlID0gMSwgYWxwaGE9MC42KSArCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxNCkgKyB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dCh2anVzdCA9IDApKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGV4cGFuZCA9IGMoMC4wMSwgMCkpICsKICBjb29yZF9jYXJ0ZXNpYW4oeGxpbSA9IGMoMCwgMjAwKSkgKyAgCiAgc2NhbGVfeV9kaXNjcmV0ZShleHBhbmQgPSBjKDAuMDEsIDApKSArIAogIGZhY2V0X2dyaWQoLn5tZWFzdXJlbWVudFR5cGUpICsKICB0aGVtZV9yaWRnZXMoKSArICMgVGhpcyBnaXZlcyB0ZXh0IGF0IHRvcCBhbmQgUkhTICsgZ3JleSBib3hlcyBmb3IgdXBwZXIgdGV4dAogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAnU2V0MScpCmBgYAoKYGBge3IsIG91dC53aWR0aD0iMTkyMHB4Iiwgb3V0LmhlaWdodD0iMTA4MHB4In0KYmlyZHNQbG90IDwtIGdncGxvdChkYXRhID0gYmlyZERTX0xvbmcsIAogICAgICAgICAgICAgICAgICAgIGFlcyh4PWJpcmREU19Mb25nJG1lYXN1cmVtZW50LCAKICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGJpcmRUeXBlLCAKICAgICAgICAgICAgICAgICAgICAgICAgZmlsbCA9IG1lYXN1cmVtZW50VHlwZSkpCmJpcmRzUGxvdCArIGdlb21fZGVuc2l0eV9yaWRnZXMyKHNjYWxlID0gMSwgYWxwaGE9MC42KSArCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxNCkgKyB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dCh2anVzdCA9IDApKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGV4cGFuZCA9IGMoMC4wMSwgMCkpICsKICBjb29yZF9jYXJ0ZXNpYW4oeGxpbSA9IGMoMCwgMjAwKSkgKyAgCiAgc2NhbGVfeV9kaXNjcmV0ZShleHBhbmQgPSBjKDAuMDEsIDApKSArIAogIGZhY2V0X2dyaWQoLn5ib25lQWxvbmUpICsKICAjdGhlbWVfcmlkZ2VzKCkgKyAKICB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gJ1NldDEnKQpgYGAKCmBgYHtyLCBvdXQud2lkdGg9IjE5MjBweCIsIG91dC5oZWlnaHQ9IjEwODBweCJ9CmJpcmRzUGxvdCA8LSBnZ3Bsb3QoZGF0YSA9IGJpcmREU19Mb25nLCAKICAgICAgICAgICAgICAgICAgICBhZXMoeD1iaXJkRFNfTG9uZyRtZWFzdXJlbWVudCwgCiAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBiaXJkVHlwZSwgCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGwgPSBtZWFzdXJlbWVudFR5cGUpKQpiaXJkc1Bsb3QgPC0gYmlyZHNQbG90ICsgZ2VvbV9kZW5zaXR5X3JpZGdlczIoc2NhbGUgPSAwLjksIGFscGhhPTAuNywgY29sb3VyID0gJ3doaXRlJywgc2l6ZSA9IDAuMSkgKwogIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHZqdXN0ID0gMCkpICsKICAjdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxNCkgKwogIHNjYWxlX3hfY29udGludW91cyhleHBhbmQgPSBjKDAuMDEsIDApKSArCiAgY29vcmRfY2FydGVzaWFuKHhsaW0gPSBjKDAsIDE1MCkpICsgIAogIHNjYWxlX3lfZGlzY3JldGUoZXhwYW5kID0gYygwLjAxLCAwKSkgKyAKICBmYWNldF9ncmlkKC5+Ym9uZUFsb25lKSArCiAgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSdub25lJykgKwogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAnU2V0MScpCgpiaXJkc1Bsb3QgPC0gYmlyZHNQbG90ICsgdGhlbWUocGFuZWwuc3BhY2luZz1ncmlkOjp1bml0KDAuMywibGluZXMiKSwKICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCgwLjUpKSwKICAgICAgICAgICAgICAgICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHNpemU9MTEpLAogICAgICAgICAgICAgICAgICAgICAgIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChtYXJnaW4gPSBtYXJnaW4oLjEsIDAsIC4xLCAwLCAiY20iKSksCiAgICAgICAgICAgICAgICAgICAgICAgc3RyaXAudGV4dC55ID0gZWxlbWVudF90ZXh0KG1hcmdpbiA9IG1hcmdpbigwLCAuMSwgMCwgLjEsICJjbSIpKSkKYmlyZHNQbG90ICsgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGwgPSBOQSwgY29sb3VyID0gImdyZXkzMCIsIHNpemUgPSAwLjEpKQpgYGAKCmZ0cDovL2NyYW4uci1wcm9qZWN0Lm9yZy9wdWIvUi93ZWIvcGFja2FnZXMvZ2dyaWRnZXMvZ2dyaWRnZXMucGRmIApodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvcGFja2FnZXMvZ2dyaWRnZXMvdmlnbmV0dGVzL2ludHJvZHVjdGlvbi5odG1sIApodHRwczovL3d3dy5nb29nbGUuY29tLmF1L3NlYXJjaD9xPXdhZGluZytiaXJkJnRibT1pc2NoJnRicz1yaW1nOkNmUy0tUy1zeE91VElqaUVnNmpYekl0UmJvMTdPd2JTc2hOUk5WRmZDY0R0VTBkcGJQdVRkSGhJUFBpWjFycFJRdFRuZWZRZ2twN3ZIWVd6WlllWGlwakItaW9TQ1lTRHFOZk1pMUZ1RWNzTkRNc3ZrN21PS2hJSmpYczdCdEt5RTFFUlc5NENlZXFrcUxRcUVnazFVVjhKd08xVFJ4R3FRaFJ2VW1pbzZ5b1NDV2xzLTVOMGVFZzhFUm8zQlRzZENqbVVLaElKLUpuV3VsRkMxT2NSZHppQzZYV1VqSFlxRWdsNTlDQ1NudThkaFJGeFBGTWRHUFo3dlNvU0NiTmxoNWVLbU1INkVlb2YzcVNTOUNndyZ0Ym89dSZzYT1YJnZlZD0yYWhVS0V3amF5TXJheUlEYkFoWEN5cndLSGJpZEJLa1E5Qzk2QkFnQkVCcyZiaXc9MTIyNSZiaWg9MTIwMiZkcHI9MQoKCmBgYHtyLCBvdXQud2lkdGg9IjE5MjBweCIsIG91dC5oZWlnaHQ9IjEwODBweCJ9CmxpYnJhcnkodmlyaWRpcykKYmlyZHNQbG90IDwtIGdncGxvdChkYXRhID0gYmlyZERTX0xvbmcsIAogICAgICAgICAgICAgICAgICAgIGFlcyh4PWJpcmREU19Mb25nJG1lYXN1cmVtZW50LCAKICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGJpcmRUeXBlLCAKICAgICAgICAgICAgICAgICAgICAgICAgZmlsbCA9IDAuNSAtIGFicygwLjUtLi5lY2RmLi4pKSkKYmlyZHNQbG90IDwtIGJpcmRzUGxvdCArIHN0YXRfZGVuc2l0eV9yaWRnZXMoZ2VvbSA9ICJkZW5zaXR5X3JpZGdlc19ncmFkaWVudCIsIGNhbGNfZWNkZiA9IFRSVUUpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMobmFtZSA9ICJUYWlsIHByb2JhYmlsaXR5IiwgZGlyZWN0aW9uID0gLTEpICsKICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dCh2anVzdCA9IDApKSArCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxNCkgKwogIHNjYWxlX3hfY29udGludW91cyhleHBhbmQgPSBjKDAuMDEsIDApKSArCiAgY29vcmRfY2FydGVzaWFuKHhsaW0gPSBjKDAsIDE1MCkpICsgIAogIHNjYWxlX3lfZGlzY3JldGUoZXhwYW5kID0gYygwLjAxLCAwKSkgKyAKICBmYWNldF9ncmlkKC5+Ym9uZSkgKwogIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0nbm9uZScpIAogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAnU2V0MScpCmJpcmRzUGxvdCA8LSBiaXJkc1Bsb3QgKyB0aGVtZShwYW5lbC5zcGFjaW5nPWdyaWQ6OnVuaXQoMC4zLCJsaW5lcyIpLAogICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gcmVsKDAuNSkpLAogICAgICAgICAgICAgICAgICAgICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZT0xMSksCiAgICAgICAgICAgICAgICAgICAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KG1hcmdpbiA9IG1hcmdpbiguMSwgMCwgLjEsIDAsICJjbSIpKSwKICAgICAgICAgICAgICAgICAgICAgICBzdHJpcC50ZXh0LnkgPSBlbGVtZW50X3RleHQobWFyZ2luID0gbWFyZ2luKDAsIC4xLCAwLCAuMSwgImNtIikpKQpiaXJkc1Bsb3QgKyB0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbCA9IE5BLCBjb2xvdXIgPSAiZ3JleTMwIiwgc2l6ZSA9IDAuMSkpCgoKYGBgCgoKCgpBY2tub3dsZWRnZW1lbnRzClRoaXMgZGF0YXNldCBpcyBwcm92aWRlZCBieSBEci4gRC4gTGl1IG9mIEJlaWppbmcgTXVzZXVtIG9mIE5hdHVyYWwgSGlzdG9yeS4KCgo=